Python:将QByteArray插入SQLite

1 投票
1 回答
912 浏览
提问于 2025-04-16 09:38

我正在尝试把图片数据(截图)存储到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()), ...)

撰写回答