12
votes

Est-il possible d'enregistrer une liste de valeurs dans une colonne SQLite?

Je veux que 3 colonnes disposent de 9 valeurs différentes, comme une liste dans Python. C'est possible? Si ce n'est pas dans SQLite, alors sur un autre moteur de base de données?


0 commentaires

3 Réponses :


11
votes

Généralement, vous le faites en limissant la liste (avec REP (REC)), puis en enregistrant la chaîne. En lisant la chaîne de la base de données, utilisez eval () pour recréer la liste. Soyez prudent, cependant que vous n'êtes certain que les données générées par l'utilisateur peuvent entrer dans la colonne, ni l'évaluation () est un risque de sécurité.


2 commentaires

Pour une référence future, ne faites jamais cela. La bibliothèque standard de Python comprend ast.literal_eval () qui peut faire exactement la même chose, mais en toute sécurité.


Aussi, le JSON module, avec json.loads et json.dumps, est plus sûr, plus rapide et permet de lire et d'écrire sur le formulaire DB Form Programmes non python



17
votes

Vous devez sérialiser la liste (ou un autre objet Python) dans une chaîne d'octets, alias "blob" ;-), via vos moyens préférés ( maréchal est bon pour les listes de valeurs élémentaires telles que Numéros ou Strings & C, CPICKLE Si vous voulez une solution très générale, etc.), et le désériorialiser lorsque vous le récupérez. Bien sûr, cela porte fondamentalement la liste (ou un autre objet Python) comme une "charge utile" passive - ne peut pas l'utiliser de manière significative dans clauses, commander par , etc., .

Les bases de données relationnelles ne traitent tout simplement pas de tout cela bien avec des valeurs non atomiques et préférez d'autres alternatives normalisées (stockez les éléments de la liste dans une table différente comprenant une colonne «ListeID», mettez le «Listid» dans votre principale. table, etc.). Des bases de données non relationnelles, bien qu'elles ont généralement des limitations WRT Relationnal (par exemple, aucune jonction), peut offrir un soutien plus direct à votre exigence.

Certains DBS relationnels ont des extensions non relationnelles. Par exemple, PostgreSQL prend en charge un Array Type de données (pas aussi en général que Listes de Python - Les tableaux de PGSQL sont intrinsèquement homogènes).


1 commentaires

Merci. Je pense que je vais redéfinir ma base de données pour avoir une table séparée, car je dois pouvoir utiliser les valeurs dans un clause.



3
votes

Votre question est difficile à comprendre. Ici, il est à nouveau:

Je veux 3 colonnes d'avoir 9 valeurs différentes, comme une liste dans Python. C'est possible? Si non dans SQLite, alors sur un autre moteur de base de données?

Voici ce que je pense que vous demandez: est-il possible de prendre une liste de python de 9 valeurs différentes et de sauvegarder les valeurs dans une colonne particulière dans un Base de données?

La réponse à cette question est "oui". Je suggère d'utiliser une bibliothèque d'ormes Python au lieu d'essayer d'écrire vous-même le code SQL. Cet exemple de code utilise automne : xxx

exécutez ceci Code, puis quittez Python et exécutez sqlite3 my_test.db . Puis exécutez cette commande sql à l'intérieur de SQLite: Sélectionnez * à partir de MyTest; Voici le résultat: xxx

Cet exemple tire les valeurs d'une liste et utilise Les valeurs pour remplir une colonne de la base de données. Il pourrait être trivialement étendu pour ajouter des colonnes supplémentaires et les peupler aussi.

Si ce n'est pas la réponse que vous recherchez, veuillez reformuler votre demande de clarification. automne.util . Le setup.py inclus avec la version actuelle de l'automne n'installe pas util.py dans le bon endroit; Vous devrez terminer la configuration de l'automne à la main.

Vous pouvez utiliser un orje plus mature tel que Sqlalchemy ou l'ormes de Django. Cependant, je fais vraiment comme l'automne, en particulier pour SQLite.


0 commentaires