2012-08-06 27 views
0

我想查询一个Microsoft SQL 2005数据库,处理数据并将密钥写入我更新到本地计算机上的sqllite3数据库存储的数据。无法使用python从mssql插入到sqlite3的二进制数据

我使用的工具是python 2.7,pyodbc和sqllite3。我在Windows 7和我尝试连接到我的mssql数据库使用SQL Server和SQL本地客户端驱动程序与pyodbc和驱动程序都产生相同的结果。

我遇到的问题是在mssql中是二进制(16)的uuid字段。当我使用pyodbc查询数据时,它会以bytearray()的形式返回给我。

这是我运行以下命令时得到的输出。

id = mycursor.fetchone() 
print id 

AO÷EAO <1ÝWt'E

repr(id) 

字节组(B '\ xe0O \ XF7 \ X1D \ x9de \ xc5O \ x8b1 \ x0e \ xddWt \ x91E')

当我去插入该Id到sqllite3数据库时,我得到以下内容。

s = sqlite3.connect('tmp.db') 
cursor = s.cursor() 
s.execute("create table recs(uuid blob)") 
s.commit() 
s.execute("insert into recs (uuid) values(?)", id) 

1 s.execute( “插入到伦理委员会(UUID)的值()?”,ID)

ProgrammingError:提供绑定的不正确的数。当前语句使用1,并提供了16个。

回答

0

Python的值必须是一个buffer对象:

>>> s.execute("insert into recs (uuid) values(?)", (buffer(id),)) 
<sqlite3.Cursor object at 0x011CD2E0> 
>>> r = s.execute("select * from recs").fetchone() 
>>> r 
(<read-write buffer ptr 0x011F9280, size 16 at 0x011F9260>,) 
>>> r[0] 
<read-write buffer ptr 0x011F9280, size 16 at 0x011F9260> 
>>> str(r[0]) 
'\xe0O\xf7\x1d\x9de\xc5O\x8b1\x0e\xddWt\x91E' 
>>> str(r[0]) == id 
True 
+0

我把它送回去,那作品!我错过了括号内的括号。非常感谢 ! – Josh 2012-08-06 19:52:46

+0

MRAB我做了一些研究,我得到了为什么现在需要缓冲区,但仍然不清楚为什么它需要在一个元组中。 – Josh 2012-08-08 02:45:45

+1

'execute'方法需要占位符的值位于元组中。只是在这种情况下有1个占位符,所以它需要1元组的值。 – MRAB 2012-08-08 16:40:21

相关问题