【问题标题】:"TypeError: not all arguments converted during string formatting" when pymysql cursor executingpymysql游标执行时“TypeError:字符串格式化期间并非所有参数都转换”
【发布时间】:2023-03-20 09:33:01
【问题描述】:

这是我第一次使用pymysql游标执行。 我有两次执行;

第一个是:

sql = 'create table if not exists currency(t integer primary key, prediction real default null, realVal real default null)'
cursor.execute(sql)

这很好用。

第二个是:

data = [(1, 12.5), (2, 10.2)]
sql = 'insert into currency(t, prediction) values(%s, %s) on duplicate key update values prediction=values(prediction)'
cursor.execute(sql, data)

问题出现在这里。 "TypeError: 在字符串格式化期间并非所有参数都被转换"

我不知道为什么会这样。任何人帮助我。 谢谢。

【问题讨论】:

  • 我不确定您是如何使用此查询和数据获得此错误的。这应该会引发语法错误,因为“更新值预测”之间的“值”太多了。然后你应该得到另一个错误,因为为t 提供的数据不是整数。
  • 感谢您的回复。顺便说一句,我不确定你是什么意思“值 b/w 更新值预测太多”。正如我所提到的,第一个 sql 完全执行并创建了一个表,我在工作台上检查了它。你能分享我正常工作的完整代码吗?
  • 我已经添加了一个完整的答案,也许现在可以说清楚了。此外,我昨天不明白您可能想一次插入多个条目。因此,我最后一句整数可能有点混乱,对此感到抱歉。

标签: python sql python-3.x pymysql


【解决方案1】:

每个人。

这是米科拉。我需要花几天的时间来解决这个问题,并最终找出答案。

此错误仅在我使用 ON DUPLICATE KEY UPDATE 时出现。

其实没有语法或逻辑错误。

这只是 MySQLdb 中的一个错误,它位于 usr/lib/pymodules/python2.7/MySQLdb/cursors.py:

restr = (r"\svalues\s*"
        r"(\(((?<!\\)'[^\)]*?\)[^\)]*(?<!\\)?'"
        r"|[^\(\)]|"
        r"(?:\([^\)]*\))"
        r")+\))")

insert_values= re.compile(restr)

为了克服这个问题,我在下面使用了两个 SQL 子句。

sql = 'insert into currency(t, prediction) select %s, %s where not exists(select * from currency where t=%s)'
cursor.execute(sql, (1, 10, 1))

sql = 'update currency set prediction=%s where t=%s'
cursor.execute(sql, (12.5, 1))

如果有人可以做得更好,请分享。

谢谢。

【讨论】:

    【解决方案2】:

    您的第二条语句有语法错误。您查询中的第二个词“值”太多了。

    insert into currency(t, prediction) values(%s, %s) 
         on duplicate key update prediction=values(prediction)
    

    此外,使用cursor.executemany() 代替execute() 插入多个条目。

    所以第二个查询的完整代码应该是:

    data = [(1, 12.5), (2, 10.2)]
    sql = 'insert into currency(t, prediction) values(%s, %s) on duplicate key update prediction=values(prediction)'
    cursor.executemany(sql, data)
    

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2015-10-28
      • 2015-01-21
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多