2012-08-09 79 views
1

我試圖通過Python更新MySQL表,使用MySQLdb包。Python MySQLdb更新列表字典

我希望與具有這種格式從詞典數據更新某個表:

muts={'YES': [rice,bread,pasta] 
     'NO': [sweets,fat,milk,choco]} 

我需要對MySQL表其列與每個條目對列表中的相應food值的行(上面字典的值),另一列名爲accept的列將被更新爲其相應的密鑰; '是或否'。

到目前爲止,當我想用​​一個列表更新從表中的條目,我用做 如下:

food=[sweets,fat,milk,choco] 
sql = "UPDATE test2 g SET accept='NO' WHERE g.food IN (%s)" 
to_add = ', '.join(list(map(lambda x: '%s', any_list))) 
sql = sql % to_add 
cursor.execute(sql, any_list) 

但現在,我想同時與一個鍵值更新字典;我迷路了。

回答

2

通過你的字典中to_add線定義有兩個%s的和循環使用SQL,所以您將kto_add

>>> muts={'YES': ['rice','bread','pasta'], 
...  'NO': ['sweets', 'fat', 'milk', 'choco']} 
>>> muts 
{'YES': ['rice', 'bread', 'pasta'], 'NO': ['sweets', 'fat', 'milk', 'choco']} 
>>> sql = "UPDATE test2 g SET accept='%s' WHERE g.food IN (%s)" 
>>> for k in muts: 
...  to_add = ', '.join(muts[k]) 
...  ex_sql = sql % (k, to_add) 
...  print ex_sql 
...  # cursor.execute(ex_sql) here 
... 
UPDATE test2 g SET accept='YES' WHERE g.food IN (rice, bread, pasta) 
UPDATE test2 g SET accept='NO' WHERE g.food IN (sweets, fat, milk, choco) 
>>> 

你可以把一個函數,並將它傳遞「any_list」 。除非執行語句,否則不能在一行中使用.execute(, any_list)

順便說一句,聯接線實際上應該是:

to_add = "'%s'" % "', '".join(muts[k]) 

讓你最終各地各種食物'報價:

... # that gives... 
UPDATE test2 g SET accept='YES' WHERE g.food IN ('rice', 'bread', 'pasta') 
UPDATE test2 g SET accept='NO' WHERE g.food IN ('sweets', 'fat', 'milk', 'choco') 

你也可以使用?佔位符語法而不是%s以避免SQL注入攻擊。

+0

哇,真了不起。 你剛剛度過了我的一天,@aneroid。 非常感謝你! – peixe 2012-08-09 10:15:16

+0

不客氣@peixe :-) – aneroid 2012-08-09 10:25:41