Проблемы с Python MySQLdb (Ошибка типа:% d формат: требуется число, а не str) - PullRequest
59 голосов
/ 26 апреля 2011

Я пытаюсь выполнить следующую операцию вставки:

cursor.execute("""
                    insert into tree (id,parent_id,level,description,code,start,end)
                    values (%d,%d,%d,%s,%s,%f,%f)
                    """, (1,1,1,'abc','def',1,1)
                    )

Структура моей таблицы MYSQL:

id int(255),
parent_id int(255),
level int(11),
description varchar(255),
code varchar(255),
start decimal(25,4),
end decimal(25,4)

Однако, когда я запускаю свою программу, я получаю ошибку

"Файл" /usr/lib/pymodules/python2.6/MySQLdb/cursors.py ", строка 151, в запросе на выполнение = запрос% db.literal (args)

TypeError:% d формат: требуется номер, не str "

Ответы [ 5 ]

142 голосов
/ 26 апреля 2011

Строка формата на самом деле не является обычной строкой формата Python.Вы должны всегда использовать %s для всех полей.

0 голосов
/ 13 марта 2019

Я получил ту же ошибку, но это было по другой причине.Проблема заключалась в том, что строка содержала символ «%», и это приводило в замешательство Python:

TemplateStr = '[....] % discount rate  [....]  %s and %s
print TemplateStr % ('abc', 'def')

Python интерпретировал этот «% discount» как «% d» и продолжал жаловаться, потому что я кормил его строкой ('abc'), а не число.

Мне потребовалось много времени, чтобы понять это!

(Решение заключается в наборе %% вместо%.)

0 голосов
/ 03 октября 2018

Всякий раз, когда вы видели ошибки такого типа, следует использовать функцию type () для проверки типов значений или переменных ...., и вы увидите тип is - 'str'.Означает, что Python принимает все значения в строках (по умолчанию тип данных - строка).Вот почему ошибка «% d» предназначена для чисел, а не для строк.Поэтому рассмотрим% s в python для всех типов полей.

0 голосов
/ 21 января 2017

Поскольку его данные представлены в целочисленном или десятичном формате, как вы можете использовать% s, который обычно используется для строкового формата% d или% i, следует использовать для целых или десятичных значений.

0 голосов
/ 12 августа 2013

попробуйте это:

cursor.execute("""
                    insert into tree (id,parent_id,level,description,code,start,end)
                    values (%s,%s,%s,'%s','%s',%s,%s)
                    """%(1,1,1,'abc','def',1,1)
                    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...