Python:将QByteArray插入SQLite

时间:2011-01-09 03:03:52

标签: python sqlite

我正在尝试将图像数据(屏幕截图)存储在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)
此代码给出了错误“TypeError:并非在字符串格式化过程中转换了所有参数” 使用QByteArray进行任何操作(包括将其转换为Qstring)都会给出这个错误,或者ascii到utf-8转换错误。 我用Google搜索了这个问题大约2天,每个建议对我来说都是不正确的。 我该如何解决?

1 个答案:

答案 0 :(得分:1)

最大的问题是你试图通过调用str(ba.data)将二进制文件存储为字符串。如果你这样做,那么它将不是一个有效的字符串,并会在以后给你带来无尽的悲伤。在幕后,SQLite对所有字符串使用Unicode。但是,它不会检查提供的字符串是否为有效的unicode(UTF8 / 16)。因此,您可以插入二进制垃圾,假装它是一个字符串,但在尝试检索它时会失败,因为它不会转换为Unicode。

SQLite有一个二进制类型(名为BLOB),这正是你应该使用的。提供二进制/ blob绑定的方式取决于您使用的SQLite包装器。看起来你正在使用PySQLite或SQLite 3.对于Python 2,使用缓冲区和Python 3使用字节。

# Python 2
params=( buffer(ba.data()), ...)
# Python 3
params=( bytes(ba.data()), ...)