2009-10-05 25 views

Respuesta

9

Debe serializar la lista (u otro objeto de Python) en una cadena de bytes, también conocida como "BLOB" ;-), a través de sus medios favoritos (marshal es bueno para listas de valores elementales como números o cadenas & c, cPickle si desea una solución muy general, etc.) y deserializarlo cuando lo recupere. Por supuesto, que, básicamente, lleva la lista (o cualquier otro objeto de Python) como una "carga útil" pasiva - no se puede utilizar de manera significativa en WHERE cláusulas, ORDER BY, etc.

bases de datos relacionales

simplemente no se ocupan del todo bien con valores no atómicos y preferiría otras alternativas normalizadas (almacene los elementos de la lista en una tabla diferente que incluya una columna "listID", coloque el "listID" en su tabla principal, etc.). Las bases de datos no relacionales, aunque típicamente tienen limitaciones con las relacionales (por ejemplo, sin uniones), pueden ofrecer un soporte más directo para sus necesidades.

Algunos DB relacionales tienen extensiones no relacionales. Por ejemplo, PostGreSQL admite un tipo de datos array (no tan general como las listas de Python, las matrices de PgSQL son intrínsecamente homogéneas).

+0

gracias.Creo que rediseñaré mi base de datos para tener una tabla separada, ya que necesito poder usar los valores en una cláusula 'WHERE'. – john2x

8

En general, esto se hace mediante una cadena de la lista (con repr()), y luego guardando la cadena. Al leer la cadena de la base de datos, use eval() para volver a crear la lista. Tenga cuidado, aunque está seguro de que ningún dato generado por el usuario puede entrar en la columna, o el eval() es un riesgo de seguridad.

3

Su pregunta es difícil de entender. Aquí está de nuevo:

Quiero que 3 columnas tengan 9 valores diferentes, como una lista en Python. ¿Es posible? Si no está en SQLite, ¿en otro motor de base de datos?

Esto es lo que creo que está preguntando: ¿es posible tomar una lista de Python de 9 valores diferentes, y guardar los valores debajo de una columna en particular en una base de datos?

La respuesta a esta pregunta es "sí". Sugiero usar una biblioteca ORM de Python en lugar de tratar de escribir el código SQL usted mismo. Este código de ejemplo utiliza 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 

ejecutar este código, a continuación, salga de Python y correr sqlite3 my_test.db. A continuación, ejecute este comando SQL dentro de SQLite: select * from mytest; Aquí está el resultado:

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

En este ejemplo se tira de los valores de una lista, y utiliza los valores para rellenar una columna de la base de datos. Podría ampliarse trivialmente para agregar columnas adicionales y llenarlas también.

Si esta no es la respuesta que está buscando, vuelva a formular su pedido para aclarar.

P.S. Este ejemplo usa autumn.util. El setup.py incluido con la versión actual de otoño no instala util.py en el lugar correcto; Tendrás que terminar la instalación de Autumn a mano.

Puede usar un ORM más maduro como SQLAlchemy o el ORM de Django. Sin embargo, realmente me gusta Autumn, especialmente para SQLite.

Cuestiones relacionadas