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

问题描述 投票:0回答:1

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

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()

引起问题的DB字段是:

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

错误是:

TypeError: %d format: a number is required, not str
python mysql mysql-python
1个回答
0
投票

这里的问题是 DATE_FORMAT 字符串在SQL查询中。的 %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)
 ;

"""

© www.soinside.com 2019 - 2024. All rights reserved.