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

+0

你说得对。在这种情况下,在Python 2.x中使用'bytes(ar)'是不正确的。 – 2010-10-21 14:03:35

+1

谢谢。这工作。另外,我发现下面还有工作,相当于: BUF =缓冲区(AR) B =字节组(BUF) BLOB = sqlite3.Binary(B) 但“B = ar.tostring ()“,正如你所建议的那样,是获取b的更好方法,并且具有很好的特性,即array.fromstring()在读取数据库时提供对数据进行解码的对称方式。 再次感谢你, -P。 – 2010-10-21 14:37:26

+0

调用'sqlite3.Binary'和调用'buffer'是一样的(检查sqlite3/dbapi2.py中的源代码)。 – 2010-10-21 15:14:02