内部ARRAY

时间:2017-02-03 19:54:14

标签: python postgresql multidimensional-array sqlalchemy

所以,我有这张桌子:

CREATE TABLE test (
    id_doc integer not null,
    multi  timestamp without time zone[]
);

'多' column应该表示类似于此JSON数组的数据:

[
    ['2017-02-03T17:20:00', '2017-02-03T17:20:01'],
    ['2017-02-01T16:21:55', '2017-02-02T13:23:03'],
]

它工作正常,除非其中一个内部数组为空。 当我尝试插入时:

INSERT INTO test (id_doc, multi)
    VALUES (1, ARRAY[ARRAY[NULL], ARRAY['2017-02-03T17:01:30'::timestamp]]);

Postgres(9.3)给出了以下错误:

ERROR:  ARRAY could not convert type timestamp without time zone[] to text[]
LINE 2: VALUES (1, ARRAY[ARRAY[NULL], ARRAY['2017-03-02T16:53:00'::t...
                                      ^

即使错误指向第二个元素(ARRAY [' 2017-02-03T17:01:30' :: timestamp]),问题似乎根植于第一个元素(ARRAY [NULL] ])因为如果我将INSERT语句更改为:

,我可以使它工作
INSERT INTO test (id_doc, multi)
    VALUES (1, ARRAY[ARRAY[NULL::timestamp], ARRAY['2017-02-03T17:01:30'::timestamp]]);

不幸的是,我使用SQLAlchemy ORM(Python),我似乎无法找到一种方法来强制SQLAlchemy将转换后缀附加到NULL字段(:: timestamp)。现在不能使用SQLAlchemy。

这似乎只发生在时间戳多维数组中。如果'多'是text []类型,例如,我可以在内部数组中插入带有NULL元素的行(没有铸造后缀)。

我不明白为什么Postgres会抱怨NULL元素。

那么,有没有人知道如何:

  1. 强制SQLAlchemy ORM将NULL / None字段转换为时间戳;或
  2. 让Postgres明白NULL是没有添加:: timestamp的时间戳吗? (也许是约束或功能?)
  3. 还有一件事:您应该知道该表实际上是自动生成的。我们有一个采用JSON模式并自动创建关系表的系统(目前仅支持PostgreSQL)。

    我们可以控制这个系统如何做到这一点,所以如果我们绝对需要更改它在Postgres数据库中表示多维数组的方式,我们就可以。但我们不愿意。

    实际上,它适用于所有类型的列/字段,除了这个带有空数组时间戳的边缘情况(仅多维,一维工作正常)。而改变它可能会破坏与我们之上运行的许多应用程序的兼容性。

    感谢任何帮助或评论。 谢谢!

0 个答案:

没有答案