Python中的MySQL动态查询语句

1 投票
2 回答
3835 浏览
提问于 2025-04-16 20:54

我想做的事情大概是这样的:

cursor = db.cursor() 
cursor.execute('INSERT INTO media_files (%s, %s, %s, %s ... ) VALUES (%s, %s, %s, %s,   ...)', (fieldlist, valuelist))
cursor.commit()

我有两个列表,一个叫fieldlist,另一个叫valuelist,它们的项目数量是一样的。请问有什么好的方法来生成一个动态的MySQL查询语句,其中列名存储在fieldlist里,而对应的值则存储在valuelist里?

2 个回答

2

光标(cursor)需要你把参数作为一个整体传递,所以你需要把字段和对应的值按顺序组合在一起。

itertools.chain() 正好可以做到这一点,不过它返回的是一个生成器,我不确定 cursor.execute() 是否能接受这个生成器作为参数序列。你可以试试看。如果不行,就用 list() 把它包裹起来。

import itertools
sql = 'INSERT INTO media_files (%s, %s, %s, %s ... ) VALUES (%s, %s, %s, %s,   ...)'
cursor.execute(sql, itertools.chain(fieldlist, valuelist))

补充:

这个方法可行。这样会导致字段名被转义并加上引号,从而引发 SQL 语法错误。
我把这个答案留着,因为它可能是个有用的例子,但请参考 @Trent 的答案来找到正确的解决方案。

3
cursor.execute('INSERT INTO media_files (%s) VALUES (%%s, %%s, %%s, %%s,   ...)' % ','.join(fieldlist), valuelist)
sql = 'INSERT INTO media_files (%s) VALUES (%%s, %%s, %%s, %%s,   ...)' % ','.join(fieldlist)
cursor.execute(sql, valuelist)

为了让它更清楚:

撰写回答