SQLAlchemy中的PostgreSQL多维数组

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)

当然,这是不对的.我错过了什么?

Fah*_*tha 5

我在这里回答这个问题,因为 Mike Bayer 在 sqlalchemy 用户上回答了这个问题。

请参阅sqlalchemy-user 上 Mike Bayer 对这个问题的回答的线程。正如 Mike 澄清的那样,正如我在阅读 PG 文档时所遗漏的那样,PG 实际上并没有强制执行数组维度,SQLA 也没有。所以,可以写integer[][],但 PG 对待它与integer[]. 特别是,PG 和 SQLA 都将接受任何维度的数组表达式。我不确定为什么会这样。正如 Mike 所引用的,PG Arrays 文档

当前的实现也不强制声明的维数。无论大小或维数如何,特定元素类型的数组都被视为相同类型。因此,在 CREATE TABLE 中声明数组大小或维数只是文档;它不会影响运行时行为。

另见他打开的。看起来这是在 SQLA 级别强制执行维度。