2012-08-06 5 views
0

Microsoft SQL 2005 데이터베이스를 쿼리하고 데이터를 처리하며 내 컴퓨터의 로컬 sqllite3 데이터베이스 저장소로 업데이트 한 데이터에 키를 쓰려고합니다.파이썬을 사용하여 mssql의 sqlite3에 바이너리 데이터를 삽입 할 수 없습니다.

내가 사용하는 도구는 python 2.7, pyodbc 및 sqllite3입니다. 나는 창 7에 있고 드라이버는 pyodbc와 SQL 서버와 SQL 네이티브 클라이언트 드라이버를 사용하여 내 mssql db에 연결을 시도하고 모두 동일한 결과를 얻을 수 있습니다.

문제는 mssql에서 이진 (16) Uuid 필드입니다. pyodbc를 사용하여 데이터를 쿼리 할 때 bytearray()로 다시 돌아옵니다.

이것은 다음을 실행할 때 출력됩니다.

id = mycursor.fetchone() 
print id 

AO ÷ EAO <1ÝWt'E

repr(id) 

된 ByteArray (b '\ xe0O \ xf7 \ x1d \ x9de \ xc5O \ x8b1 \ x0e \ xddWt \ x91E')

sqllite3 데이터베이스에 해당 ID를 삽입하려면 다음과 같이하십시오.

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 ("RECS 삽입 (UUID) 값()?", ID)

ProgrammingError : 공급 바인딩 잘못된 번호. 현재 명령문은 1을 사용하고 16 개가 제공됩니다.

답변

0

파이썬 값이 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

+0

MRAB 몇 가지 연구를했는데 왜 버퍼가 필요한지 알 수 있지만 터플에 있어야하는 이유는 여전히 불분명합니다. – Josh

+1

'execute' 메소드는 플레이스 홀더가 튜플에 있어야합니다. 이 경우에는 1 개의 자리 표시자가 있으므로 1-tuple의 값이 필요합니다. – MRAB

관련 문제