Sto provando ad inserire dati da un dizionario in un database usando parametri con nome. Ho questo lavoro con una semplice dichiarazione SQL, ad es.Python sqlite insert named parameters o null
SQL = "INSERT INTO status (location, arrival, departure) VALUES (:location, :arrival,:departure)"
dict = {'location': 'somewhere', 'arrival': '1000', 'departure': '1001'}
c.execute(SQL,dict)
Inserisce da qualche parte nella posizione, 1000 nella colonna di arrivo e 1001 nella colonna di partenza.
I dati che effettivamente avrò conterranno la posizione ma potrebbero contenere arrivo o partenza ma potrebbero non avere entrambi (nel qual caso NULL o NULL possono entrare nella tabella). In questo caso, ottengo sqlite3.ProgrammingError: Non è stato fornire un valore per il legame 2.
posso risolvere questo problema utilizzando defaultdict:
c.execute(SQL,defaultdict(str,dict))
per rendere le cose un po 'più complicato, io in realtà hanno un elenco di dizionari contenenti più posizioni con arrivo o partenza.
({'location': 'place1', 'departure': '1000'},
{'location': 'palce2', 'arrival': '1010'},
{'location': 'place2', 'departure': '1001'})
e voglio essere in grado di eseguire questo con c.executemany però io ora non posso usare defaultdict.
È possibile eseguire il ciclo di ogni dizionario nell'elenco ed eseguire molte istruzioni c.execute, ma executemany sembra un modo più ordinato di farlo.
Ho semplificato questo esempio per comodità, i dati effettivi hanno molte più voci nel dizionario e lo costruisco da un file di testo JSON.
Qualcuno ha qualche suggerimento su come potrei fare questo?
Grazie Martin - che funziona. Per chiunque abbia questo problema, il dizionario predefinito deve contenere una voce per ogni possibile elemento, anche se il dizionario effettivo lo avrà sempre. Inoltre, c'è una parentesi chiusa finale mancante nella riga executemany. – user2497185