Python中的MySQL动态查询语句
我想做的事情大概是这样的:
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)
为了让它更清楚: