python sqlite insert paramètres nommés ou null
J'essaie d'insérer des données à partir d'un dictionnaire dans une base de données en utilisant des paramètres nommés. J'ai ce travail avec une simple instruction SQL par exemple
SQL = "INSERT INTO status (location, arrival, departure) VALUES (:location, :arrival,:departure)"
dict = {'location': 'somewhere', 'arrival': '1000', 'departure': '1001'}
c.execute(SQL,dict)
Insère quelque part dans l'emplacement, 1000 dans l'arrivée de la colonne, et 1001 dans le départ de la colonne.
Les données que je vais effectivement avoir contiendra un endroit, mais peut contenir soit à l'arrivée ou au départ mais peut ne pas avoir les deux (dans ce cas, rien ou NULL peut aller dans la table). Dans ce cas, j'obtiens sqlite3.ProgrammingError: Vous n'avez pas à fournir une valeur pour la liaison 2.
Je peux résoudre ce problème en utilisant defaultdict:
c.execute(SQL,defaultdict(str,dict))
Pour rendre les choses un peu plus compliqué, je vais vraiment avoir une liste de dictionnaires contenant plusieurs endroits avec une arrivée ou au départ.
({'location': 'place1', 'departure': '1000'},
{'location': 'palce2', 'arrival': '1010'},
{'location': 'place2', 'departure': '1001'})
et je veux être en mesure de l'exécuter avec c.executemany cependant maintenant, je ne peux pas utiliser defaultdict.
J'ai pu parcourir chaque dictionnaire dans la liste et de l'exécution de nombreux c.exécuter des instructions, mais executemany semble plus propre façon de le faire.
J'ai simplifié de cet exemple pour des raisons de commodité, les données réelles a beaucoup plus d'entrées dans le dictionnaire, et je le construire à partir d'un JSON fichier texte.
Quelqu'un a des suggestions pour savoir comment je pourrais faire cela?
source d'informationauteur user2497185
Vous devez vous connecter pour publier un commentaire.
Utilisation
None
pour insérer unNULL
:Vous pouvez utiliser un dictionnaire par défaut et un générateur pour l'utiliser avec
executemany()
:Il y a une solution simple à ce problème qui devrait être possible dans la plupart des cas; juste passer
executemany
une liste dedefaultdict
au lieu d'une liste dedict
.En d'autres termes, si vous construisez à partir de zéro vos lignes comme
defaultdict
vous pouvez passer à la liste dedefaultdict
de lignes directement à la commandeexecutemany
au lieu de construire comme des dictionnaires et, plus tard, patch de la situation avant d'utiliserexecutemany
.De travail suivants exemple (Python 3.4.3) montre le point:
Si vous l'exécutez, il imprime: