我正在尝试使用MySQLdb软件包通过Python更新MySQL表。
我希望使用具有以下格式的字典中的数据更新某个表:
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)
但是现在我想用字典中的键值同时更新;我迷路了。
答案 0 :(得分:2)
使用两个%s定义sql并在字典中循环以获取to_add行,因此您放置k
和to_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获取语句列表,否则不能在一行中使用.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注入攻击。