Проблемы с Python MySQLdb (TypeError:% d format: требуется номер, а не str)

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

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"

Ответ 1

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

Ответ 2

попробуйте следующее:

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

(Решение состоит в том, чтобы ввести %% вместо%.)

Ответ 6

enter image description here Здесь скорее пишем & d, ставим% s для всего.