在python

时间:2016-06-30 13:56:52

标签: python mysql sql python-2.7 mysql-python

我在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回滚。如果我硬编码字典值,那么插入工作正常。你能否指出使用变量代替硬编码值的正确方法?

1 个答案:

答案 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')运行语句。这对你的陈述不起作用。