Python:将QByteArray插入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: not all arguments converted during string formatting”。
每次处理QByteArray(包括把它转换成QString)的时候,我都会遇到这个错误,或者是从ascii转换成utf-8的时候出错。
我在网上搜索了这个问题大约两天,得到的建议对我来说都不管用。
我该怎么解决这个问题呢?
1 个回答
1
最大的问题是,你试图通过调用 str(ba.data) 来把二进制数据存储为字符串。如果这样做的话,存储的内容就不是一个有效的字符串,之后会给你带来无尽的麻烦。在后台,SQLite 对所有字符串使用的是 Unicode 编码。不过,它并不会检查你提供的字符串是否是有效的 Unicode(UTF8/16)。因此,你可以插入一些二进制的垃圾数据,假装它是字符串,但在尝试取出这些数据时会失败,因为它无法转换为 Unicode。
SQLite 有一种二进制类型,叫做 BLOB,这正是你应该使用的。提供二进制/BLOB 绑定的方式取决于你使用的 SQLite 封装库。看起来你在使用 PySQLite 或 SQLite 3。对于 Python 2,使用 buffer;对于 Python 3,使用 bytes。
# Python 2
params=( buffer(ba.data()), ...)
# Python 3
params=( bytes(ba.data()), ...)