Python SqlAlchemy 插入包含 NULL 值的数组(postgres)不可能?

6 投票
2 回答
6624 浏览
提问于 2025-04-17 22:50

我正在使用多维数组,发现Postgres在插入值时需要进行类型转换,比如:

CREATE TABLE test (
    pay  integer[]
);
CREATE TABLE

INSERT INTO test values (ARRAY[NULL]);
ERROR:  column "pay" is of type integer[] but expression is of type text[]
LINE 1: INSERT INTO test values (ARRAY[NULL]);
                                 ^
HINT:  You will need to rewrite or cast the expression.

INSERT INTO test values (ARRAY[NULL::integer]); -- How to do this on SqlAlchemy ?
INSERT 0 1                                      -- ARRAY[NULL]::integer[] would also works

这就是当我添加一个对象时SqlAlchemy所做的事情,如果值是NULL,它就不会进行类型转换。以下是我代码的一部分:

from sqlalchemy.dialects.postgresql import ARRAY
class Test (Base):

    __tablename__ = 'test'

    pay = Column(ARRAY(Integer))

member = Test()
member.pay = [None]
session.add(member)
session.commit()

然后在Postgres的日志中我得到了:

ERROR:  column "pay" is of type integer[] but expression is of type text[] at character 26
HINT:  You will need to rewrite or cast the expression.
STATEMENT:  INSERT INTO test (pay) VALUES (ARRAY[NULL]);  -- See ?? No casting from SqlAlchemy

所以我的问题是:我该怎么做才能让SqlAlchemy在列表中的值为None时也进行类型转换?也许可以实现一些自定义的类型?

2 个回答

0

看起来你想要插入的是

VALUES (ARRAY[NULL])

但是系统把它理解成了

VALUES ('ARRAY[NULL]')

而你其实想插入的是

VALUES ({NULL})

或者

VALUES ({})

也就是一个空数组。

想了解更多关于数组的行为和相关例子,可以查看PostgreSQL手册的数组页面

2

看起来这是psycopg2中的一个遗漏;把版本从2.4.6升级到2.6.2就解决了这个问题。当然要感谢SQLA的作者@zzzeek。

撰写回答