Python Sqlite3: INSERT INTO table de VALEUR(dictionnaire)
Je voudrais utiliser un dictionnaire pour insérer des valeurs dans un tableau, comment pourrais-je faire cela?
import sqlite3
db = sqlite3.connect('local.db')
cur = db.cursor()
cur.execute('DROP TABLE IF EXISTS Media')
cur.execute('''CREATE TABLE IF NOT EXISTS Media(
id INTEGER PRIMARY KEY, title TEXT,
type TEXT, genre TEXT,
onchapter INTEGER, chapters INTEGER,
status TEXT
)''')
values = {'title':'jack', 'type':None, 'genre':'Action', 'onchapter':None,'chapters':6,'status':'Ongoing'}
#What would I Replace x with to allow a
#dictionary to connect to the values?
cur.execute('INSERT INTO Media VALUES (NULL, x)'), values)
cur.execute('SELECT * FROM Media')
meida = cur.fetchone()
print meida
La question ici est: Pourquoi voudriez-vous faire cela? Ce que vous voulez accomplir, et pourquoi pensez-vous de garder deux choses complètement différemment spécifié choses (une table SQL et un
Ne sais pas ce que l'auteur a voulu, mais j'ai trouvé la question parce que je suis de la génération de la
Je sais que c'est un peu tard, mais... Si vous êtes juste de préchargement d'une base de données XML à utiliser plus statiquement plus tard, je serais probablement construire un script de charge au lieu d'un tas de plaquettes; si vous êtes accédant à la base de données avec des colonnes dynamiques tout le temps, vous devriez sérieusement envisager un autre type de magasin que d'une base de données relationnelle SQL. Ce que vous faites ce qui serait le mieux dans votre cas, mais n'est-ce pas, de sorte que SQL rend difficile.
dict
jeu de clés) dans la synchronisation est la bonne façon de le faire?Ne sais pas ce que l'auteur a voulu, mais j'ai trouvé la question parce que je suis de la génération de la
create table
à partir de la structure d'un fichier XML, puis quand je vais à insert
les lignes, j' le attrs et vals-les-bains dans un dict et je sais que la db va les avoir, mais ils ne sont jamais statiques.Je sais que c'est un peu tard, mais... Si vous êtes juste de préchargement d'une base de données XML à utiliser plus statiquement plus tard, je serais probablement construire un script de charge au lieu d'un tas de plaquettes; si vous êtes accédant à la base de données avec des colonnes dynamiques tout le temps, vous devriez sérieusement envisager un autre type de magasin que d'une base de données relationnelle SQL. Ce que vous faites ce qui serait le mieux dans votre cas, mais n'est-ce pas, de sorte que SQL rend difficile.
OriginalL'auteur Crispy | 2013-01-01
Vous devez vous connecter pour publier un commentaire.
Si vous essayez d'utiliser un
dict
à spécifier à la fois les noms de colonnes et les valeurs, vous ne pouvez pas le faire, du moins pas directement.C'est vraiment inhérents à SQL. Si vous ne spécifiez pas la liste des noms de colonnes, vous devez les spécifier dans
CREATE TABLE
afin que vous ne pouvez pas faire avec unedict
, car undict
a pas d'ordre. Si tu le voulais vraiment, bien sûr, vous pouvez utiliser uncollections.OrderedDict
, assurez-vous qu'il est dans le bon ordre, et puis il suffit de passervalues.values()
. Mais à ce point, pourquoi ne pas simplement avoir unlist
(outuple
) en premier lieu? Si vous êtes absolument sûr que vous avez toutes les valeurs, dans le bon ordre, et que vous voulez consulter, par ordre plutôt que par le nom, ce que vous avez est unlist
, pas undict
.Et il n'y a aucun moyen de lier les noms de colonnes (ou les noms de table, etc.) dans SQL, des valeurs.
Vous pouvez, bien sûr, générer l'instruction SQL de façon dynamique. Par exemple:
Cependant, c'est presque toujours une mauvaise idée. Ce n'est pas vraiment beaucoup mieux que la génération et la
exec
ing dynamique de code Python. Et vous venez de perdre tous les avantages de l'utilisation des espaces réservés dans la première place—principalement la protection contre les attaques par injection SQL, mais aussi des choses moins importantes comme une compilation plus rapide, une meilleure gestion du cache, etc. dans le moteur DB.C'est probablement mieux de prendre du recul et de regarder ce problème à partir d'un niveau plus élevé. Par exemple, peut-être que vous n'avez pas vraiment envie d'une liste statique de propriétés, mais plutôt un nom et d'une valeur
MediaProperties
table? Ou, alternativement, peut-être vous voulez un peu de type de document basé sur le stockage (si c'est une grande puissance nosql système, ou juste un tas de JSON ou YAML les objets stockés dans unshelve
)?Une alternative à l'aide nommé espaces réservés:
execute
appel remplace chacune le nom de l'espace réservé par la recherche jusqu'à son nom comme un élément clé dansmy_dict
. Par conséquent, il devrait certainement êtrekeys
, pasvalues
. Imaginez quemy_dict = {'spam': 'eggs'}
. Si vous mettez un espace réservé:eggs
dans l'instruction SQL, qui ne serait pas trouvé dansmy_dict
; vous avez besoin:spam
.Des espaces réservés automatiquement faire une bonne échapper, tandis que si vous créez la requête, vous-même, vous avez besoin de coder le caractère spécial échapper à la logique.
Des espaces réservés à ne pas faire une bonne échapper, même automatiquement. Ils n'ont tout simplement pas le faire fuir, car ils ne sont pas textuellement inséré dans une instruction SQL.
Techniquement, sous les couvertures, certains SQL bibliothèques réellement faire gérer des espaces réservés par juste de s'échapper dans la chaîne... Mais les utilisateurs n'ont pas à savoir que; chaque SQL bibliothèque n'est la meilleure chose avec des espaces réservés pour le backend, et il le fait correctement, donc +1 sur votre commentaire.
Fonctionne comme un charme! ty
OriginalL'auteur abarnert
Il y a une solution pour utiliser les dictionnaires. Tout d'abord, l'instruction sql
ne fonctionnerait pas, car il suppose que vous faites référence à toutes les colonnes, dans l'ordre qu'ils sont définis dans le
CREATE TABLE
instruction, comme abarnert déclaré. (Voir SQLite INSÉRER.)Une fois que vous avez fixé par spécifier les colonnes, vous pouvez utiliser des espaces réservés nommés pour insérer des données. L'avantage, c'est que c'est en toute sécurité s'échappe de la clé-des caractères, de sorte que vous n'avez pas à vous inquiéter. À partir de la Python sqlite-documentation:
Hey j'ai fait un edit, mais pris une autre erreur par la suite et je ne peux pas changer assez pour faire un autre haha. À la fin de votre déclaration que vous avez
);)'
quiexecute()
sera lu comme vous essayer de faire plusieurs états. Supprimer les)
et tout est bien. 🙂OriginalL'auteur MrGumble
Vous pouvez utiliser les paramètres nommés:
Cela dépend toujours de l'ordre des colonnes dans la
INSERT
déclaration (ceux:
sont seulement utilisés comme clés dans lavalues
dict) mais c'est au moins s'éloigne de commander les valeurs sur le python côté, de plus, vous pouvez avoir d'autres choses dansvalues
qui sont ignorés ici; si vous êtes en tirant ce qui est dans le dict en dehors de la stocker dans plusieurs tables, qui peuvent être utiles.Si vous souhaitez éviter les doublons de noms, vous pouvez les extraire à partir d'un
sqlite3.Row
objet de résultat, ou decur.description
, après avoir fait un mannequin de la requête; il peut être rationnel pour les maintenir autour de python forme près de là où vous faites votreCREATE TABLE
.OriginalL'auteur eichin
Faire votre échapper droit.
Vous avez sans doute aussi besoin d'un
commit
y quelque part.key_lst
pour spécifier l'ordre des colonnes au lieu de retaper?cur.execute('INSERT INTO Media ({}) VALUES ();'.format(','.join(key_lst), ','.join(['?'] * len(key_lst))), tuple(values[k] for k in key_lst))
parce que vous êtes encore en laissant éventuellement fourni par l'utilisateur de données dans l'instruction sql avec lui échapper. Et je pense qu'il vous manque un {} dans le format de déclaration. Vous devez inclure cette proposition dans votre réponse si vous le souhaitez.
OriginalL'auteur tacaswell
J'ai eu le même problème j'ai donc créé une chaîne de caractères en premier et ensuite passé à la chaîne d'exécuter la commande. Il ne prend plus de temps à s'exécuter, mais la cartographie a été parfait pour moi. Juste un travail autour de:
En faisant au-dessus de chose je me suis assuré que si mon dict (record_tab) ne contient pas un domaine particulier, alors le script habitude de jeter erreur et bon mapping peut être fait, ce qui est pourquoi j'ai utilisé le dictionnaire à la première place.
OriginalL'auteur yash jain
J'ai eu un problème similaire et à la fin quelque chose pas entièrement à la différence de ce qui suit (Notez - c'est le cas des OP de code avec des morceaux changé, de sorte qu'il fonctionne de la manière qu'ils ont demandé)-
OriginalL'auteur Subgenius