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