Estoy usando SQLAlchemy 0.6.3 con PostgreSQL 8.4 en Debian squeeze. Quiero una tabla donde una columna almacene algo en PostgreSQL que aparezca en Python como una lista de listas enteras o tuplas de tuplas enteras. P.ej.Arrays multidimensionales PostgreSQL en SQLAlchemy
((1,2), (3,4), (5,6,7))
En el siguiente ejemplo, esa columna es model
. Pensé que un enfoque razonable podría ser almacenar cosas como una tabla PG 2 dimensional, que en PG se parece al integer[][]
. No sé en qué forma SQLA devolverá esto a Python, pero espero que sea algo así como una tupla de tuplas.
Sin embargo, no puedo entender cómo decirle a SQLA que me proporcione una matriz de enteros bidimensional. El documentation para sqlalchemy.dialects.postgresql.ARRAY
dice
item_type - El tipo de datos de elementos de esta matriz. Tenga en cuenta que la dimensionalidad es irrelevante aquí, por lo que las matrices multidimensionales como INTEGER [] [], se construyen como ARRAY (Entero), no como ARRAY (ARRAY (Entero)) o similar. El mapeo tipo se da cuenta sobre la marcha.
Lamentablemente, no tengo idea de lo que eso significa. ¿Cómo puede el mapeo tipo resolver esto sobre la marcha? Necesita crear el DDL correcto. Mi primera y única suposición de cómo hacer esto habría sido ARRAY(ARRAY(Integer))
. Actualmente tengo
crossval_table = Table(
name, meta,
Column('id', Integer, primary_key=True),
Column('created', TIMESTAMP(), default=now()),
Column('sample', postgresql.ARRAY(Integer)),
Column('model', postgresql.ARRAY(Integer)),
Column('time', Float),
schema = schema,
Esto crea la siguiente DDL
CREATE TABLE crossval (
id integer NOT NULL,
created timestamp without time zone,
sample integer[],
model integer[],
"time" double precision
);
lo cual no es cierto, por supuesto. ¿Qué me estoy perdiendo?
Si va a hacer mucho de este tipo de cosas, entonces puede considerar el clima un DB relacional es la mejor opción para usted. – Mark
@Mark: No sigo. Mucho de qué tipo de cosas? –
Si intenta persistir en una gran cantidad de matrices de matrices o mapas de mapas, etc., puede que busque una base de datos que admita ese concepto como una 1ra clase, por ejemplo, redis – Mark