我正在尝试使用 MySQLDb 库中的 executemany
进行多重查询。四处搜索后,我发现我必须创建一个使用 INSERT INTO
和 ON DUPLICATE KEY
的命令,而不是按顺序使用 UPDATE
使用executemany
到目前为止一切都很好,但后来我遇到了一个问题,我无法有效地设置 SET
部分。我的表有大约 20 列(是否要批评表的肥胖取决于你。到目前为止它对我有用),如果可能的话,我想有效地形成命令字符串。
现在我有
update_query = """
INSERT INTO `my_table`
({all_columns}) VALUES({vals})
ON DUPLICATE KEY SET <should-have-each-individual-column-set-to-value-here>
""".format(all_columns=all_columns, vals=vals)
其中 all_columns
涵盖所有列,vals 涵盖一堆 %s
,因为我稍后将使用 executemany
。
但是我不知道如何形成字符串的 SET
部分。我考虑过使用逗号分割将它们分成列表中的元素,但我不确定是否可以迭代它们。
总的来说,这样做的目标是只调用一次数据库进行更新,这是我现在能想到的唯一方法。如果您有更好的想法,也请告诉我。
编辑:添加更多信息
all_columns
类似于 'id, id2, num1, num2'
vals
现在设置为 '%s, %s, %s, %s'
当然,列数不仅仅是 4
最佳答案
假设您有一个用于命令集合的元组列表:
listUpdate = [('f1', 'i'), ('f2', '2')]
setCommand = ', '.join([' %s = %s' % x for x in listUpdate])
all_columns = 'id, id2, num1, num2'
vals = '%s, %s, %s, %s'
update_query = """
INSERT INTO `my_table`
({all_columns}) VALUES({vals})
ON DUPLICATE KEY SET {set}
""".format(all_columns=all_columns, vals=vals, set=setCommand)
print(update_query)
关于python - 是否可以创建一个接受 python-mysql 中变量列表的查询命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438478/