我正在使用Python中的MySQLdb模块来编写SQL语句。我很难以我想要的方式使用变量。这是我的工作:
stmt = '''
INSERT INTO Table1
(name, status)
SELECT (:name1, :status1)
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM Table1
WHERE name =(:name1))
'''
dic = {"name1":"Bob", "status1":"Active"}
dbcursor.executemany(stmt, dic)
dbconnection.commit()
print("Insertion to Table1 committed\n\n")
这不起作用,我最终回滚并显示错误消息在字符串格式化期间未转换所有参数
。如果我对字典值进行硬编码,那么插入就可以正常工作。您能否指出使用变量代替硬编码值的正确方法?
最佳答案
executemany()
接受参数对象(字典)的序列,但您仅传入一个。使用dbcursor.execute()
,或者传入一系列字典。由于您只有一本字典,因此只需使用dbcursor.execute()
:
dbcursor.execute(stmt, dic)
因为 executemany()
将第二个参数视为一系列参数,每个参数都在单独的 execute()
调用中使用,因此您实际上是在尝试运行以字典的键作为参数的语句。实际上,传入您的 dic
作为参数会产生:
for key in dic:
dbcursor.execute(stmt, key)
其中键也是可迭代的,生成单独的字符作为使用的参数。您正在尝试使用 ('n', 'a', 'm', 'e', '1')
和 ('s', 't', ' 运行该语句a'、't'、'u'、's'、'1')
。这对你的陈述不起作用。
关于python - 在Python中使用execute()/executemany()执行SQL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38125308/