【问题标题】:Executemany insert on duplicate key update error: Not all parameters were usedExecutemany 在重复键更新错误时插入:未使用所有参数
【发布时间】:2018-09-10 14:29:15
【问题描述】:

所以我一直在尝试使用 mysql.connector 使用 python 2.7.15 执行此查询。 但由于某种原因,它似乎不起作用并总是返回错误:并非所有参数都被使用。

表更新有一个主键'ID'

这是我尝试运行此 SQL 的查询:

sql = "INSERT INTO updates (ID, insert_datetime, egroup, job_state) VALUES (%s,%s,%s,%s) ON DUPLICATE KEY UPDATE insert_datetime = VALUES(%s), egroup = VALUES(%s), job_state = VALUES(%s);"
mycursor.executemany(sql, jobUpdatesList)

jobUpdatesList 数组中的一个数组如下所示:

[u'17281725', datetime.datetime(2018, 9, 10, 16, 11, 45, 724000), u'language', u'R', datetime.datetime(2018, 9, 10, 16, 11, 45, 724000), u'language', u'R']

我这样做是因为我认为它需要 7 个参数,因为我有 7 个 %s

我也尝试使用这样的 4 个参数:

sql = "INSERT INTO updates (ID, insert_datetime, egroup, job_state) VALUES (%s,%s,%s,%s) ON DUPLICATE KEY UPDATE ID = VALUES(%s), insert_datetime = VALUES(%s), egroup = VALUES(%s), job_state = VALUES(%s);"
mycursor.executemany(sql, jobUpdatesList)

jobUpdatesList 数组中的一个数组如下所示:

[u'17281725', datetime.datetime(2018, 9, 10, 16, 18, 9, 268000), u'language', u'R']

然后我收到以下错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%s), egroup = VALUES(%s), job_state = VALUES(%s)' at line 1

当我尝试通过将 VALUES(%s) 替换为“%s”来修复此错误时,它起作用了。除了它用 %s 而不是值替换了所有字段。我也尝试使用未引用的 %s ,例如:egroup = %s 但我得到了同样的错误。

我尝试了很多东西,但我似乎无法让它发挥作用。 我做错了什么?

【问题讨论】:

  • 不能使用位置参数绑定列名;这是您的代码失败的直接原因。但是,你能告诉我们当插入重复的ID 时应该发生什么的逻辑是什么?
  • @TimBiegeleisen 首先我需要插入所有最新的项目,如果一个已经存在我想更新该行的信息,以便它再次更新。我也以这种方式插入语句并且它们确实有效,所以我认为问题出在 ON DUPLICATE KEY 部分。
  • 我不同意,q.v.我的回答如下。

标签: python mysql syntax-error


【解决方案1】:

不可能使用位置参数来表示实际的列名;出于多种原因,需要在语句中对列名进行硬编码。但是,在您的情况下,我认为这样做没有任何问题:

INSERT INTO updates (ID, insert_datetime, egroup, job_state)
VALUES (%s,%s,%s,%s)
ON DUPLICATE KEY UPDATE
    insert_datetime = VALUES(insert_datetime),
    egroup = VALUES(egroup),
    job_state = VALUES(job_state);

或者,作为 Python 代码:

sql = "INSERT INTO updates (ID, insert_datetime, egroup, job_state) VALUES (%s,%s,%s,%s) ON DUPLICATE KEY UPDATE insert_datetime = VALUES(insert_datetime), egroup = VALUES(egroup), job_state = VALUES(job_state);"
mycursor.executemany(sql, jobUpdatesList)

【讨论】:

  • 是的,这解决了我的问题。我坚持认为 mysql 库会将所有 %s 符号替换为数组中它们各自的值,因为当我引用它们时它们确实有效。因此我尝试使用 7 个参数。这现在更有意义了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2013-08-02
  • 2019-10-28
相关资源
最近更新 更多