Python 2.7、sqlite3、ValueError:无法将BLOB转换为缓冲区

Python 2.7、sqlite3、ValueError:无法将BLOB转换为缓冲区,python,sqlite,Python,Sqlite,我试图在SQLite数据库中保存从整数数组(即整数的压缩数组)创建的BLOB。下面显示的脚本提供了以下回溯。从Python2.7SQLITE3文档中可以看出,应该可以将缓冲区对象插入表中,并将其保存为BLOB。然而,我无法使这项工作。(FWIW,isinstance(b,buffer)如果插入脚本,则打印True,因此我确实在创建一个buffer对象。) 有什么建议吗 谢谢, -P 回溯(最近一次呼叫最后一次): 文件“example.py”,第13行,在 conn.execute('inser

我试图在SQLite数据库中保存从整数数组(即整数的压缩数组)创建的BLOB。下面显示的脚本提供了以下回溯。从Python2.7SQLITE3文档中可以看出,应该可以将缓冲区对象插入表中,并将其保存为BLOB。然而,我无法使这项工作。(FWIW,isinstance(b,buffer)如果插入脚本,则打印True,因此我确实在创建一个buffer对象。)

有什么建议吗

谢谢, -P

回溯(最近一次呼叫最后一次):
文件“example.py”,第13行,在

conn.execute('insert-into-foo-values(?),(b,)#Cristian Ciupitu关于该错误的说明是正确的,但是
bytes(ar)
将为您提供u-str_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,使用


使用
array.fromstring
再次取消数组序列化-您必须创建一个具有相同类型的数组对象,然后调用
。fromstring(…)

您是对的。在Python2.x中使用
bytes(ar)
在这种情况下是不正确的。谢谢。这很有效。此外,我还发现以下方法也有效,并且是等效的:buf=buffer(ar)b=bytearray(buf)blob=sqlite3.Binary(b),但正如您所建议的,“b=ar.tostring()”是获得b的更好方法,并且具有很好的特性,即array.fromstring()在读取DB时提供对称的数据解码方式。再次感谢您,-P.调用
sqlite3.Binary
与调用
buffer
相同(请从
sqlite3/dbapi2.py
中查看源代码)。
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()