2011-01-09 79 views
1

我试图在SQLite数据库中存储图像数据(屏幕截图)。 Python:插入QByteArray到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转换错误。 我把谷歌搜索了大约2天,每个建议对我来说都不正确。 我该如何解决它?

+0

首先,指定哪条线路导致错误。完整的追溯将会有所帮助。然后,(假设最后一行)尝试将`params`中的每个参数更改为`“”``,一次一个,以查明破损的一个。 – TryPyPy 2011-01-09 09:08:47

回答

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()), ...)