【问题标题】:Python: Insert QByteArray to SQLitePython:将 QByteArray 插入 SQLite
【发布时间】:2011-01-09 03:03:51
【问题描述】:

我正在尝试将图像数据(屏幕截图)存储在 SQLite 数据库中。

现在 = int(math.floor(time.time()))
ba = QByteArray()
buff = QBuffer(ba)
image.save(buff,格式)
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 convert during string formatting” 对 QByteArray 的任何操作(包括将其转换为 Qstring)都会给我这个错误,或 ascii 到 utf-8 的转换错误。 我在谷歌上搜索了这个问题大约 2 天,每个建议对我来说都是不正确的。 我该如何解决?

【问题讨论】:

  • 首先,指定导致错误的行。完整的追溯会有所帮助。然后,(假设最后一行)尝试将params 中的每个参数更改为"",一次一个,以查明损坏的参数。

标签: python sqlite


【解决方案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()), ...)

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 2019-07-25
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多