【问题标题】:Using execute()/executemany() for SQL statements in python在 python 中对 SQL 语句使用 execute()/executemany()
【发布时间】:2016-11-02 16:17:59
【问题描述】:

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

【问题讨论】:

  • 提示:使用"""...""" 三重引号,您就不必使用所有这些反斜杠了..
  • 全部回滚肯定有异常?
  • @MartijnPieters 是的,它的“并非所有参数都在字符串格式化期间转换”
  • 对,那正好符合我的回答;您正在尝试分别以('n', 'a', 'm', 'e', '1')('s', 't', 'a', 't', 'u', 's', '1') 作为参数运行stmt SQL,并且由于stmt 中没有位置绑定参数,因此没有使用这些参数值。

标签: python mysql sql mysql-python


【解决方案1】:

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') 运行该语句。这不适用于您的陈述。

【讨论】:

  • 刚刚试过这个。错误告诉我检查我的语法,所以这是进步,我现在正在检查我的 sql 版本的语法规则
猜你喜欢
  • 2021-02-28
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
相关资源
最近更新 更多