2011-01-09 128 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()), ...)