2009-10-05 3 views

Répondre

9

Vous devez sérialiser la liste (ou un autre objet Python) dans une chaîne d'octets, alias « blob » ;-), par vos moyens préférés (marshal est bon pour les listes de valeurs élémentaires telles que des numéros ou des chaînes & c, cPickle si vous voulez une solution très générale, etc.), et désérialisez-la lorsque vous la récupérez. Bien sûr, qui porte essentiellement la liste (ou un autre objet Python) comme une « charge utile » passive - ne peut pas utiliser de façon significative dans WHERE clauses, ORDER BY, etc.

bases de données relationnelles juste ne traitent pas bien tout ce qui avec des valeurs non-atomiques et préférerait d'autres alternatives normalisées (stockez les éléments de la liste dans une table différente qui inclut une colonne "listID", placez le "listID" dans votre table principale, etc.). Les bases de données non relationnelles, bien qu'elles aient généralement des limitations par rapport aux bases relationnelles (par exemple, aucune jointure), peuvent offrir une prise en charge plus directe de vos besoins.

Certains DB relationnels ont des extensions non relationnelles. Par exemple, PostGreSQL supporte un type de données array (pas aussi général que les listes de Python - les tableaux de PgSQL sont intrinsèquement homogènes).

+0

merci.Je pense que je vais redessiner ma base de données pour avoir une table séparée, car je dois pouvoir utiliser les valeurs dans une clause 'WHERE'. – john2x

8

Généralement, vous le faites en stringifiant la liste (avec repr()), puis en sauvegardant la chaîne. En lisant la chaîne de la base de données, utilisez eval() pour recréer la liste. Soyez prudent, même si vous êtes certain qu'aucune donnée générée par l'utilisateur ne peut entrer dans la colonne, ou eval() est un risque de sécurité.

3

Votre question est difficile à comprendre. La voici encore:

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

Voici ce que je crois que vous demandez: est-il possible de prendre une liste Python de 9 valeurs différentes, et enregistrer les valeurs sous une colonne particulière dans une base de données?

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

import autumn 
import autumn.util 
from autumn.util import create_table 

# get a database connection object 
my_test_db = autumn.util.AutoConn("my_test.db") 


# code to create the database table 
_create_sql = """\ 
DROP TABLE IF EXISTS mytest; 
CREATE TABLE mytest (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    value INTEGER NOT NULL, 
    UNIQUE(value) 
);""" 

# create the table, dropping any previous table of same name 
create_table(my_test_db, _create_sql) 

# create ORM class; Autumn introspects the database to find out columns 
class MyTest(autumn.model.Model): 
    db = my_test_db 


lst = [3, 6, 9, 2, 4, 8, 1, 5, 7] # list of 9 unique values 

for n in lst: 
    row = MyTest(value=n) # create MyTest() row instance with value initialized 
    row.save() # write the data to the database 

Exécutez ce code, puis quittez Python et exécuter sqlite3 my_test.db. Ensuite, exécutez cette commande SQL dans SQLite: select * from mytest; Voici le résultat:

1|3 
2|6 
3|9 
4|2 
5|4 
6|8 
7|1 
8|5 
9|7 

Cet exemple tire des valeurs d'une liste, et utilise les valeurs pour remplir une colonne de la base de données. Il pourrait être étendu de manière triviale pour ajouter des colonnes supplémentaires et les peupler également.

Si ce n'est pas la réponse que vous cherchez, veuillez reformuler votre demande pour clarifier.

P.S. Cet exemple utilise autumn.util. Le setup.py inclus avec la version actuelle d'Automne n'installe pas util.py au bon endroit; Vous devrez terminer l'installation d'Automne à la main.

Vous pouvez utiliser un ORM plus mature tel que SQLAlchemy ou l'ORM de Django. Cependant, j'aime vraiment Autumn, surtout pour SQLite.

Questions connexes