Ответ 1
Строка формата на самом деле не является обычной строкой формата Python. Вы всегда должны использовать %s
для всех полей.
Я пытаюсь выполнить следующую операцию вставки:
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/python 2.6/MySQLdb/cursors.py ", строка 151, в исполнении query = query% db.literal(args)
TypeError: формат% d: требуется число, а не str"
Строка формата на самом деле не является обычной строкой формата Python. Вы всегда должны использовать %s
для всех полей.
попробуйте следующее:
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)
)
Поскольку его данные в целочисленном или десятичном формате, как вы можете использовать% s, который обычно используется для формата строки,% d или% я следует использовать для целочисленных или десятичных значений.
Всякий раз, когда вы видели ошибки такого типа, следует использовать функцию type() для проверки типов значений или переменных...., и вы увидите тип is - 'str'. Означает, что Python принимает все значения в строках (по умолчанию тип данных - строка). Поэтому ошибка говорит, что% d для чисел, а не для строк. Поэтому рассмотрим% s в python для всех типов полей.
Я получил ту же ошибку, но это было по другой причине. Проблема заключалась в том, что строка содержала символ "%" и это приводило в замешательство Python:
TemplateStr = '[....] % discount rate [....] %s and %s
print TemplateStr % ('abc', 'def')
Python интерпретировал это "% discount" как "% d" и продолжал жаловаться, потому что я кормил его строкой ('abc'), а не числом.
Мне понадобилось много времени, чтобы понять это!
(Решение состоит в том, чтобы ввести %% вместо%.)