2012-08-06 24 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

相關問題