Python 内部数组中包含空元素的多维数组

Python 内部数组中包含空元素的多维数组,python,postgresql,multidimensional-array,sqlalchemy,Python,Postgresql,Multidimensional Array,Sqlalchemy,所以,我有这个表: CREATE TABLE test ( id_doc integer not null, multi timestamp without time zone[] ); “multi”列应该表示类似于此JSON数组的数据: [ ['2017-02-03T17:20:00', '2017-02-03T17:20:01'], ['2017-02-01T16:21:55', '2017-02-02T13:23:03'], ] 它工作正常,除非其中

所以,我有这个表:

CREATE TABLE test (
    id_doc integer not null,
    multi  timestamp without time zone[]
);
“multi”列应该表示类似于此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...
                                      ^
尽管错误指向第二个元素(数组['2017-02-03T17:01:30'::timestamp]),但问题似乎源于第一个元素(数组[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将强制转换后缀附加到空字段(::timestamp)的方法。现在不使用SQLAlchemy不是一个选项

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

我不明白为什么Postgres抱怨空元素

那么,有没有人知道一种方法:

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

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

    事实上,它适用于所有类型的列/字段,除了这个带有空时间戳数组的单边情况(仅多维,一维很好)。而改变这一点可能会破坏与在此基础上运行的许多应用程序的兼容性

    欢迎提供任何帮助或意见。
    谢谢

    我认为您应该展示Python代码,其中sqlalchemy被告知要发挥其神奇作用。这里有几种替代方法:
    array[null]::timestamp[]
    '{null}::timestamp[]
    您可以通过函数插入/更新数据,或者使用
    多文本[]
    test
    表上创建视图,并为强制转换文本[]]要在insert/UPDATE上添加时间戳[],请提供完整的MCVE?查看一个适当MCVE的示例。我认为您应该展示Python代码,其中sqlalchemy被告知要发挥其魔力。这里有几种替代方法:
    array[null]::timestamp[]
    '{null}'::timestamp[]
    您可以通过函数插入/更新数据,或使用
    多文本[][]在
    测试
    表上创建视图
    并在插入/更新时为转换文本[]到时间戳[]创建触发器能否提供完整的MCVE?有关正确MCVE的示例,请参见。