Python 2.7,sqlite3,ValueError:无法将BLOB转换为缓冲区
问题描述:
我试图保存从SQLite数据库中的整数数组(即整数数组)中创建的BLOB。下面的脚本给出了以下回溯。据我可以从Python 2.7 sqlite3文档中看到,应该可以将一个缓冲区对象插入到一个表中,它应该被保存为一个BLOB。但是,我无法完成这项工作。 (FWIW,isinstance(b,buffer)打印真如果插入脚本,所以我的确在创建一个缓冲区对象。)Python 2.7,sqlite3,ValueError:无法将BLOB转换为缓冲区
有什么建议吗?
谢谢, -P。
Traceback (most recent call last):
File "example.py", line 13, in <module>
conn.execute('insert into foo values (?)', (b,)) # <=== line 14
ValueError: could not convert BLOB to buffer
import sqlite3
import sys
import array
ar = array.array('I')
ar.extend([1,0,3,11,43])
b = buffer(ar)
conn = sqlite3.connect(':memory:')
conn.execute('create table foo(bar BLOB)')
conn.commit()
conn.execute('insert into foo values (?)', (b,)) # <=== line 14
conn.commit()
答
克里斯蒂安Ciupitu的有关错误说明是正确的,但bytes(ar)
会给你__str__表示,而不是串行化输出。因此,请使用ar.tostring()
。
使用array.fromstring
来重新反序列化数组 - 您必须创建一个具有相同类型的数组对象,然后调用.fromstring(...)
。
你说得对。在这种情况下,在Python 2.x中使用'bytes(ar)'是不正确的。 – 2010-10-21 14:03:35
谢谢。这工作。另外,我发现下面还有工作,相当于: BUF =缓冲区(AR) B =字节组(BUF) BLOB = sqlite3.Binary(B) 但“B = ar.tostring ()“,正如你所建议的那样,是获取b的更好方法,并且具有很好的特性,即array.fromstring()在读取数据库时提供对数据进行解码的对称方式。 再次感谢你, -P。 – 2010-10-21 14:37:26
调用'sqlite3.Binary'和调用'buffer'是一样的(检查sqlite3/dbapi2.py中的源代码)。 – 2010-10-21 15:14:02