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

3

我正在尝试将由整数数组(即整数的打包数组)创建的BLOB保存在SQLite数据库中。下面显示的脚本给出了以下回溯信息。据我从Python 2.7 sqlite3文档中所看到的,应该可以将缓冲区对象插入到表中,以便将其保存为BLOB。但是,我无法使其正常工作。(顺便说一句,如果将isinstance(b,buffer)插入到脚本中,则会打印True,因此我确实正在创建缓冲区对象。)

有什么建议吗?

谢谢, -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()
1个回答

2
Cristian Ciupitu对于这个错误的说明是正确的,但是bytes(ar)将给出__str__表示而不是序列化输出。因此,请使用ar.tostring()
使用array.fromstring再次反序列化数组-您必须创建一个具有相同类型的数组对象,然后调用.fromstring(...)

你是对的。在Python 2.x中使用bytes(ar)在这种情况下是不正确的。 - Cristian Ciupitu
1
谢谢。这个方法可行。此外,我发现以下方法也可行且等效:buf = buffer( ar ) b = bytearray( buf ) blob = sqlite3.Binary( b )但是像你建议的 "b = ar.tostring()" 这样做更好,而且具有很好的特性,当读取数据库时,array.fromstring() 提供了对称解码数据的方式。再次感谢, -P. - Peter Shenkin
调用 sqlite3.Binary 和调用 buffer 是一样的(请查看 sqlite3/dbapi2.py 的源代码)。 - Cristian Ciupitu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接