TypeError: не все аргументы, преобразованные во время форматирования строки
У меня возникли проблемы с загрузкой CSV файла в базу данных mysql. Здесь мой код:
for q in csvReader:
name, price, LastUpdate, today = q
co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(name, price, LastUpdate);""",q)
Я получаю сообщение об ошибке TypeError: не все аргументы, преобразованные во время форматирования строки.
Столбец имени - это строка, цена - это float, а LastUpdate - дата. Я немного прочитал и увидел некоторые скрипты, которые завернули значения в% (значение) s и% (значение) d (в моем случае вместо d я использую f), но затем я получаю другую ошибку:
ТипError: формат требует отображения
Может ли кто-нибудь помочь мне показать, что я делаю неправильно?
Спасибо!
Ответы
Ответ 1
Если я правильно помню, вы должны использовать %s
с MySQLdb в запросе, чтобы обозначить позиции, которые вы хотите форматировать элементы кортежа аргументов. Это отличается от обычных ?
заполнителей, используемых в большинстве других реализаций.
for q in csvReader:
name, price, LastUpdate, today = q
co.execute("INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %s, %s);",q)
EDIT: Здесь также приведен пример вставки нескольких строк одновременно, что более эффективно, чем вставка их по одному. Из Руководство пользователя MySQLdb:
c.executemany(
"""INSERT INTO breakfast (name, spam, eggs, sausage, price)
VALUES (%s, %s, %s, %s, %s)""",
[
("Spam and Sausage Lover Plate", 5, 1, 8, 7.95 ),
("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
] )
Здесь мы вставляем три строки из пяти значений. Обратите внимание: сочетание типов (строки, ints, floats), хотя мы все еще используем% s. А также обратите внимание, что мы включили только строки форматирования для одной строки. MySQLdb выбирает их и дублирует их для каждой строки.
Ответ 2
Из сообщения об ошибке метод execute()
подставляет ваши параметры в ваш оператор SQL с помощью %
. Но вы не указали, где кто-то из них идет, поэтому ни один из ваших параметров не используется, все они оставлены, и поэтому вы получите сообщение о том, что осталось немного (эй, все это!). Прочтите документацию для вашего драйвера базы данных, чтобы узнать, что он хочет использовать в качестве токена замещения; вероятно, %s
.
Ответ 3
Формат требует сопоставления, потому что вы устанавливаете имя для токенов замены строк и ожидается словарь.
если вы оставили их как% s% d% f и т.д. без скобок, он будет принимать аргументы по порядку из списка или кортежа (q)
for q in csvReader:
co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %f, %s);""",q[:-1])