Вставить список словарей и переменных в таблицу - PullRequest
0 голосов
/ 17 мая 2018
lst = [{'Fruit':'Apple','HadToday':2},{'Fruit':'Banana','HadToday':8}]

У меня длинный список словарей в форме выше.
У меня есть две фиксированные переменные.

person = 'Sam'
date = datetime.datetime.now()

Я хочу вставить эту информацию в таблицу mysql.

Как мне это сделать сейчас

for item in lst:
    item['Person'] = person
    item['Date'] = date

cursor.executemany("""
    INSERT INTO myTable (Person,Date,Fruit,HadToday)
    VALUES (%(Person)s, %(Date)s, %(Fruit)s, %(HadToday)s)""", lst)

conn.commit()

Это способ сделать это, который обходит цикл, так как переменные человека и даты постоянны. Я пытался

lst = [{'Fruit':'Apple','HadToday':2},{'Fruit':'Banana','HadToday':8}]
cursor.executemany("""
    INSERT INTO myTable (Person,Date,Fruit,HadToday)
    VALUES (%s, %s, %(Fruit)s, %(HadToday)s)""", (person,date,lst))

conn.commit()

TypeError: недостаточно аргументов для строки формата

1 Ответ

0 голосов
/ 17 мая 2018

Ваша проблема здесь в том, что он пытается применить все lst к %(Fruit)s и ничего не остается для %(HadToday)s).

Вы не должны исправлять это путем жесткого кодирования фиксированных значений в выраженииесли у вас возникнут проблемы, если у вас есть имя типа «Тим О'Моллиган» - лучше, чтобы БД обрабатывал правильное форматирование.

Не mysql, но вы понимаете суть: http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters - узнал это сам неделю назад; o)

Вероятно, самый чистый способ - использовать

cursor.execute("SET @myname = %s", (person,))
cursor.execute("SET @mydate = %s", (datetime.datetime.now(),)) 

и использовать

cursor.executemany("""
    INSERT INTO myTable (Person,Date,Fruit,HadToday)
    VALUES (@myname, @mydate, %(Fruit)s, %(HadToday)s)""", lst)

Я не на 100% уверен в синтаксисе, но надеюсь, вы поняли идею.Прокомментируйте / отредактируйте ответ, если в нем есть ошибка.

...