繁体   English   中英

TypeError: %d format: a number is required, not str - 数据库字段是字符串,传递的变量是字符串格式的数字

[英]TypeError: %d format: a number is required, not str - DB field is string, variable passed is number in string format

我有一个基于字符串字段进行过滤的查询,其中包含前导零的电话号码。 我的查询使用%s作为占位符,变量在执行时传递给查询,如下所示:

rows = (('01234567891',), ('01234567892',), ('01234567893',))

dbQuery2 = """
SELECT DATE_FORMAT(DATE(ch.start), '%d/%m/%Y') As CallDate,
             ch.did AS InboundNo,
             COUNT(*) AS DayTotal
      FROM call_history ch LEFT JOIN
           ast_queue_log aql
           ON aql.event = 'ENTERQUEUE' AND aql.callid = ch.callid
      WHERE ch.did = %s AND
            ch.start BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND NOW()
      GROUP BY ch.did, DATE(ch.start)
      ORDER BY ch.did, DATE(ch.start)
     ;
"""

for row in rows:
    cur2.execute(dbQuery2, row)
    subrows = cur.fetchall()

导致问题的数据库字段是:

`did` varchar(32) NOT NULL DEFAULT '',`

错误是:

TypeError: %d format: a number is required, not str

这里的问题是 SQL 查询中的DATE_FORMAT字符串。 %d%m%Y被解释为变量占位符并且 MySQLdb 引擎尝试替换那里的变量而不是WHERE子句中的变量。

通过在查询中使用以下格式修复:

dbQuery2 = """
SELECT DATE_FORMAT(DATE(ch.start), '%%d/%%m/%%Y') As CallDate,
         ch.did AS InboundNo,
         COUNT(*) AS DayTotal
  FROM call_history ch LEFT JOIN
       ast_queue_log aql
  ON aql.event = 'ENTERQUEUE' AND aql.callid = ch.callid
  WHERE ch.did = %s AND
            ch.start BETWEEN DATE_FORMAT(NOW(), '%%Y-%%m-01') AND NOW()
  GROUP BY ch.did, DATE(ch.start)
  ORDER BY ch.did, DATE(ch.start)
 ;

"""

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM