【问题标题】:MySQLdb delete query - TypeError: not all arguments converted during string formattingMySQLdb 删除查询 - TypeError:字符串格式化期间并非所有参数都转换
【发布时间】:2013-05-15 16:53:44
【问题描述】:

我正在尝试使用 MySQLdb 运行删除查询并传递 3 个变量。查询运行如下:

self.cursor.execute("""DELETE er.* FROM extension_recording er, 
  extension e, client c 
 WHERE er.extension_id = e.id AND e.client_id = c.id 
  AND c.parent_client_id = %s 
  AND DATE(er.cr_date) BETWEEN '%s' AND '%s'""" , 
(client_id, start_date, end_date))

请原谅缩进,没有它似乎无法使其清晰。

会发生什么:TypeError: not all arguments converted during string formatting

我尝试将 SQL 作为字符串传递给游标(我知道这很容易受到 SQL 注入的影响,只是在测试),结果是一样的。我已经检查了 SQL,它似乎很好。

这与查询中的单引号日期有关吗?还是别的什么?

【问题讨论】:

  • BETWEEN '%s' AND '%s'改成BETWEEN %s AND %s还能用吗?如果不是,client_idstart_dateend_date的类型是什么?
  • 不行,已经试过了。客户 ID 是一个字符串,另外两个是日期。
  • 我想也许一个更好的问题是,我应该如何使用 MySQLdb 运行删除查询,因为我需要使用日期作为标准?这是最好的方法还是有其他方法?
  • 我只是尝试了一个类似的例子,我无法重现错误。您说您尝试将 SQL 作为字符串传递,我假设您的意思是您在执行查询之前插入了值。你能包括你这样做时得到的确切的 SQL 吗? TBH,不过,我看不出该代码有什么问题,所以你确定这是产生错误的查询吗?可能有助于包含完整的堆栈回溯。
  • @Aya 感谢您的持续帮助,这是执行前的 SQL:DELETE er.* FROM extension_recording er, extension e, client c WHERE er.extension_id = e.id AND e.client_id = c.id AND c.parent_client_id = 0009 AND DATE(er.cr_date) BETWEEN '2013-05-01' AND '2013-05-15'

标签: python mysql mysql-python


【解决方案1】:

回溯中有线索……

Traceback (most recent call last):
  File "/usr/local/bin/recording_archive_newer.py", line 194, in <module>
    print "Error %s deleting from DB" % (sys.exc_info())
TypeError: not all arguments converted during string formatting

问题不在于查询,而在于打印错误消息。

sys.exc_info() 返回一个包含三个元素的元组,但您只在字符串 "Error %s deleting from DB" 中指定了一个占位符。

值得注意的是(sys.exc_info())不是一个元素的元组,而是被解释为sys.exc_info()。如果你想让它成为一个单元素元组,你需要一个尾随逗号,即(sys.exc_info(),)

但是,如果该行是块的一部分,例如...

try:
    # do query
except:
    print "Error %s deleting from DB" % (sys.exc_info())

...您最好重新提出原始异常,否则将很难找出实际问题所在。我建议将其更改为...

try:
    # do query
except:
    print "Error deleting from DB"
    raise

...至少在您调试时。

【讨论】:

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