所以,我有这张桌子:
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元素。
那么,有没有人知道如何:
还有一件事:您应该知道该表实际上是自动生成的。我们有一个采用JSON模式并自动创建关系表的系统(目前仅支持PostgreSQL)。
我们做可以控制这个系统如何做到这一点,所以如果我们绝对需要更改它在Postgres数据库中表示多维数组的方式,我们就可以。但我们不愿意。
实际上,它适用于所有类型的列/字段,除了这个带有空数组时间戳的边缘情况(仅多维,一维工作正常)。而改变它可能会破坏与我们之上运行的许多应用程序的兼容性。
感谢任何帮助或评论。 谢谢!