Я пытаюсь вставить данные из словаря в базу данных, используя именованные параметры. У меня это работает с простым оператором SQL, например.
SQL = "INSERT INTO status (location, arrival, departure) VALUES (:location, :arrival,:departure)"
dict = {'location': 'somewhere', 'arrival': '1000', 'departure': '1001'}
c.execute(SQL,dict)
Вставляется куда-нибудь в местоположение, 1000 в столбец прибытия и 1001 в столбец отправления.
Данные, которые у меня будут на самом деле, будут содержать местоположение, но могут содержать либо прибытие, либо отправление, но могут не иметь обоих (в этом случае в таблицу может попасть либо ничего, либо NULL). В этом случае я получаю sqlite3.ProgrammingError: вы не указали значение для привязки 2.
Я могу исправить это, используя defaultdict:
c.execute(SQL,defaultdict(str,dict))
Чтобы немного усложнить ситуацию, у меня будет список словарей, содержащих несколько мест с прибытием или отправлением.
({'location': 'place1', 'departure': '1000'},
{'location': 'palce2', 'arrival': '1010'},
{'location': 'place2', 'departure': '1001'})
и я хочу иметь возможность запускать это с помощью c.executemany, однако теперь я не могу использовать defaultdict.
Я мог бы пройтись по каждому словарю в списке и запустить множество операторов c.execute, но executemany кажется более аккуратным способом сделать это.
Я упростил этот пример для удобства, фактические данные имеют гораздо больше записей в словаре, и я создаю их из текстового файла JSON.
У кого-нибудь есть предложения, как я могу это сделать?