Próbuję wstawić dane ze słownika do bazy danych przy użyciu nazwanych parametrów. Mam to działa z prostą instrukcją SQL, np.python sqlite insert o nazwie parametry lub null
SQL = "INSERT INTO status (location, arrival, departure) VALUES (:location, :arrival,:departure)"
dict = {'location': 'somewhere', 'arrival': '1000', 'departure': '1001'}
c.execute(SQL,dict)
Wstawia gdzieś do lokalizacji, 1000 w kolumnie Przybycie i 1001 w kolumnie odlotu.
Dane, które faktycznie będę zawierał będą zawierać lokalizację, ale mogą zawierać zarówno przybycie, jak i odlot, ale mogą nie mieć obu (w takim przypadku nic lub NULL nie może przejść do tabeli). W tym przypadku, mam sqlite3.ProgrammingError: Nie dostarczyć wartość dla wiązania 2.
mogę rozwiązać ten problem za pomocą defaultdict:
c.execute(SQL,defaultdict(str,dict))
do rzeczy nieco bardziej skomplikowana, będę rzeczywiście lista słowników zawierających wiele lokalizacji wraz z przybyciem lub odlotem.
({'location': 'place1', 'departure': '1000'},
{'location': 'palce2', 'arrival': '1010'},
{'location': 'place2', 'departure': '1001'})
i chcę, aby być w stanie uruchomić ten z c.executemany jednak teraz nie można używać defaultdict.
Potrafię przeglądać każdy słownik na liście i uruchamiać wiele instrukcji c.execute, ale executemany wydaje się być bardziej przejrzystą metodą.
Uproszyłem ten przykład dla wygody, rzeczywiste dane zawierają dużo więcej wpisów w słowniku i buduję je z pliku tekstowego JSON.
Ktoś ma jakieś sugestie, jak mógłbym to zrobić?
Thanks Martin - który działa. Dla każdego, kto ma ten problem, domyślny słownik musi zawierać wpis do każdego możliwego elementu, nawet jeśli rzeczywisty słownik zawsze będzie go zawierał. Brak również końcowego nawiasu zamykającego w linii executemany. – user2497185