2012-08-09 49 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