我正在尝试完成以下内容:
cursor = db.cursor()
cursor.execute('INSERT INTO media_files (%s, %s, %s, %s ... ) VALUES (%s, %s, %s, %s, ...)', (fieldlist, valuelist))
cursor.commit()
我有2个列表,fieldlist和valuelist,每个列表包含相同数量的项目。生成动态MySQL查询语句的最佳方法是将列存储在fieldlist中,并将值存储在valuelist中?
答案 0 :(得分: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)
答案 1 :(得分:2)
游标希望参数作为单个序列传递,因此您需要按顺序组合字段和值列表。
itertools.chain()
完全确实如此,但它返回一个生成器,我不确定cursor.execute()
是否会接受它作为param序列。试试吧。如果失败,请用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对该解决方案的回答。