Запрос и извлечение значения Unicode из sqlite3 в Python

У меня возникают проблемы с попыткой извлечь значения в кодировке utf-8, хранящиеся в базе данных sqlite3 на python.

>> import sqlite3
>> connection=sqlite3.connect('mySQLite3DB.db')
>> cursor=connection.cursor()
>> word = unichr(2675)+unichr(37) # ੳ%
>> cursor.execute('select distinct col1 from table1 where col1 like ? limit 3', word)
---------------------------------------------------------------------------
ProgrammingError                          Traceback (most recent call last)
/Users/punjcoder/code/<ipython-input-10-358f7ffe8df0> in <module>()
----> 1 cursor.execute('select distinct col1 from table1 where col1 like ? limit 3', word)

ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied.

Теперь, если я запустил запрос, вручную вставив юникод, он запустится. Однако я не могу получить текст, а вместо этого буфер ptr.

>> cursor.execute('select distinct col1 from table1 where col1 like "ੳ%" limit 3')
<sqlite3.Cursor at 0x10dab8500>
>> for row in cursor.fetchall():
>>      print row
(<read-write buffer ptr 0x10dabf898, size 3 at 0x10dabf858>,)

Я уже видел ссылки ниже, но не могу найти способ заставить его работать. Я работаю над Python 2.7.2 и SQLite 3.7.10. Ваша помощь будет оценена заранее.


person PunjCoder    schedule 17.04.2012    source источник


Ответы (1)


Пытаться:

 cursor.execute('select distinct col1 from table1 where col1 like ? limit 3', [word])

Я ожидаю, что вы обрабатываете строку Юникода word как повторяемую и видите каждый символ отдельно.

person Larry Lustig    schedule 17.04.2012
comment
Это помогло из-за неправильного количества привязок. Для второго помогло добавление этого в верхней части скрипта. импорт sys reload (sys) sys.setdefaultencoding (utf-8) - person PunjCoder; 17.04.2012
comment
@PunjCoder, не используйте этот трюк. Кодировка по умолчанию ascii ожидается некоторыми стандартными библиотеками. Просто явно .decode('utf8') вместо этого. - person Mark Tolonen; 18.04.2012