2014-01-16 70 views
1

我將MSD數據庫中的md5哈希值存儲爲二進制文件(16)。我需要使用pymssql插入幾千個值,如果我用cursor.execute()而不是cursor.executemany()逐個插入值,則該值非常慢。 但問題是,我不能插入二進制數據,因爲executemany把我的MD5哈希值的列表,並把它作爲一個字符串...用executemany插入二進制文件(16)

我插線看起來是這樣的:

# generated from hashlib.md5('somestring').hexdigest() 
md5list = ['9e107d9d372bb6826bd81d3542a419d6', 'e4d909c290d0fb1ca068ffaddf22cbd0'] 
# query should look like this: insert into hashes (md5) values (0x9e107d9d372bb6826bd81d3542a419d6) 
cursor.executemany("insert into hashes (md5) values (0x%s)", md5list) 
# now we have a query like: insert into hashes (md5) values (0x'9e107d9d372bb6826bd81d3542a419d6') 

有一種用executemany插入哈希的方法?

回答

0

Cursor.executemany的查詢參數應該是序列的序列。

使用`int(..,16)將十六進制字符串轉換爲int。

>>> int('9e107d9d372bb6826bd81d3542a419d6', 16) 
210103647840849757586127012022035159510L 
>>> hex(int('9e107d9d372bb6826bd81d3542a419d6', 16)) 
'0x9e107d9d372bb6826bd81d3542a419d6L' 

如何使用列表理解?

md5list = ['9e107d9d372bb6826bd81d3542a419d6', 
      'e4d909c290d0fb1ca068ffaddf22cbd0'] 
params = [[int(h, 16)] for h in md5list] 
cursor.executemany("insert into hashes (md5) values (%s)", params) 
+0

問題不是0x,但pymssql假定這是一個字符串類型,並將「」添加到它。當我嘗試插入'0x ...'它根本不工作,因爲mssql不想要一個字符串... – reox

+0

@reox,好的。我更新了答案。 – falsetru

+0

好吧,對不起,我編輯了你的答案,但那也是錯誤的......你不能在pymssql中使用%x,並且%s總是將它放入''中。 :(和字符串不工作與mssql – reox