Fah*_*tha 8 python sqlalchemy multidimensional-array
我在Debian上使用SQLAlchemy 0.6.3和PostgreSQL 8.4.我想要一个表,其中一列在PostgreSQL中存储一些东西,它在Python中显示为整数列表或整数元组的元组列表.例如
((1,2), (3,4), (5,6,7))
Run Code Online (Sandbox Code Playgroud)
在下面的示例中,该列是model.我认为合理的方法可能是将东西存储为PG 2维表,这在PG中看起来像integer[][].我不知道SQLA将以什么形式将其返回给Python,但我希望它类似于元组的元组.
但是,我无法弄清楚如何告诉SQLA给我一个二维整数数组.该文档的sqlalchemy.dialects.postgresql.ARRAY说
item_type - 此数组项的数据类型.请注意,维度在这里是无关紧要的,因此像INTEGER [] []这样的多维数组被构造为ARRAY(整数),而不是ARRAY(ARRAY(整数))等.类型映射即时显示.
不幸的是,我不知道这意味着什么.类型映射如何在运行中实现这一点?它需要创建正确的DDL.我的第一个也是唯一的猜测是如何做到的ARRAY(ARRAY(Integer)).目前我有
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,
Run Code Online (Sandbox Code Playgroud)
这将创建以下DDL
CREATE TABLE crossval (
id integer NOT NULL,
created timestamp without time zone,
sample integer[],
model integer[],
"time" double precision
);
Run Code Online (Sandbox Code Playgroud)
当然,这是不对的.我错过了什么?
我在这里回答这个问题,因为 Mike Bayer 在 sqlalchemy 用户上回答了这个问题。
请参阅sqlalchemy-user 上 Mike Bayer 对这个问题的回答的线程。正如 Mike 澄清的那样,正如我在阅读 PG 文档时所遗漏的那样,PG 实际上并没有强制执行数组维度,SQLA 也没有。所以,可以写integer[][],但 PG 对待它与integer[]. 特别是,PG 和 SQLA 都将接受任何维度的数组表达式。我不确定为什么会这样。正如 Mike 所引用的,PG Arrays 文档说
当前的实现也不强制声明的维数。无论大小或维数如何,特定元素类型的数组都被视为相同类型。因此,在 CREATE TABLE 中声明数组大小或维数只是文档;它不会影响运行时行为。
另见他打开的票。看起来这是在 SQLA 级别强制执行维度。