我在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")
这不起作用,我最终使用错误消息not all arguments converted during string formatting
回滚。如果我硬编码字典值,那么插入工作正常。你能否指出使用变量代替硬编码值的正确方法?
答案 0 :(得分:0)
executemany()
获取参数对象(字典)的序列,但您传入一个。使用dbcursor.execute()
或传入一系列词典。由于您只有一个字典,只需使用dbcursor.execute()
:
dbcursor.execute(stmt, dic)
因为executemany()
将第二个参数视为一系列参数,每个参数都在单独的execute()
调用中使用,所以您实际上是在尝试使用键运行语句 of the dictionary作为参数。实际上,传递dic
作为参数会产生:
for key in dic:
dbcursor.execute(stmt, key)
其中键也是可迭代的,产生单独的字符作为使用的参数。您正尝试使用('n', 'a', 'm', 'e', '1')
和('s', 't', 'a', 't', 'u', 's', '1')
运行语句。这对你的陈述不起作用。