我正在尝试将图像数据(屏幕截图)存储在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天,每个建议对我来说都是不正确的。 我该如何解决?
答案 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()), ...)