1

我正在尝试使用 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)

但是现在我想同时更新字典中的键值;我迷路了。

4

1 回答 1

2

用两个 %s 定义 sql 并在字典中循环查找 to_add 行,因此放置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 需要一个语句列表,否则您不能.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 注入攻击。

于 2012-08-09T09:20:09.860 回答