Python: вставьте QByteArray в SQLite - PullRequest
1 голос
/ 09 января 2011

Я пытаюсь сохранить данные изображения (снимки экрана) в базе данных SQLite.

now = int(math.floor(time.time()))
ba = QByteArray()
buff = QBuffer(ba)
image.save(buff, format)
params = (str(ba.data()), "image/%s"%format, now, url)
s_conn = sqlite.connect("cache/screenshots_%s.db"%row['size'])
s_curs = s_conn.cursor()
s_curs.execute("UPDATE screenshots SET data=?, mime=?, created=? WHERE filename=?", params)
Этот код выдает мне ошибку «Ошибка типа: не все аргументы преобразованы во время форматирования строки» Любые манипуляции с QByteArray (включая преобразование его в Qstring) дают мне эту ошибку, или ошибку преобразования ascii в utf-8. Я погуглил эту проблему в течение приблизительно 2 дней, и каждый совет был неправильным для меня. Как я могу обойти это?

1 Ответ

1 голос
/ 09 января 2011

Самая большая проблема в том, что вы пытаетесь сохранить двоичный файл в виде строки, вызывая str (ba.data).Если вы сделаете это, то это не будет действительной строкой, и позже вы будете страдать бесконечно.За кулисами SQLite использует Unicode для всех строк.Однако он не проверяет, является ли указанная строка действительным Unicode (UTF8 / 16).Следовательно, вы можете вставить двоичный мусор, притворяясь, что это строка, но при попытке получить его не получится, поскольку он не преобразуется в Unicode.

SQLite имеет двоичный тип (с именем BLOB), и это именно то, что выследует использовать.Способ предоставления привязки двоичного файла или блоба зависит от используемой оболочки SQLite.Похоже, вы используете PySQLite или SQLite 3. Для Python 2 используйте буфер, а для Python 3 - байты.

# Python 2
params=( buffer(ba.data()), ...)
# Python 3
params=( bytes(ba.data()), ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...