![](/img/trans.png)
[英]Flask-SQLAlchemy TypeError: %d format: a number is required, not str when using filter on a string field
[英]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.