Python:将 QByteArray 插入 SQLite

标签 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 转换错误。 我已经用谷歌搜索这个问题大约两天了,每条建议对我来说都是不正确的。 我该如何解决这个问题?

最佳答案

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

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

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

关于Python:将 QByteArray 插入 SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4637436/

相关文章:

python - 类型错误 : the JSON object must be str, 不是 'bytes' - Python - fixer.io

python - pytube 有进度条功能吗?

python - 更新 pandas 数据框中的值

c++ - SQLite 返回 NULL 行

java - Android Studio 访问 SQLite 数据库 Java

python - 将时间增量数组转换为瞬时数组

python - 应用函数然后过滤 DataFrame

python - "no such table"异常

iphone - 用于 iPhone 问题/错误/问题的 SQLite?

database - 安卓新手 : openOrCreateDatabase(): where does the sqlite file go?