TypeError: формат% d: требуется число, а не str - поле DB - это строка, переданная переменная - это число в строковом формате - PullRequest
0 голосов
/ 28 мая 2020

У меня есть запрос, который фильтрует на основе строкового поля, содержащего номера телефонов с нулем в начале. В моем запросе %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()

Поле DB, вызывающее проблему:

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

ошибка:

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

1 Ответ

0 голосов
/ 28 мая 2020

Проблема здесь в строках 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)
 ;

"" "

...