Postgres + SQLAlchemy + psycopg3:使用 upsert 操作处理序列列

问题描述 投票:0回答:1

我有下表:

    test = Table('test', meta,
        Column('id', Integer, primary_key = True, autoincrement=True),
        Column('name', String, unique= True),
        Column('description', String),

在上面,id列成为postgres表中的SERIAL列。

我希望能够进行批量插入并处理 id 列可能为空也可能不为空的情况(基本上是更新插入)。 by sql 看起来像这样(插入记录后我想将其更新到 tmp_tbl 中)

insert into test(id,name) select * from tmp_tbl on conflict(id) do update set name = EXCLUDED.name;drop table if exists tmp_tbl;

问题是如果“id”为空,我会收到约束错误。 如果 id 不为空,则可以正常工作。

'null value in column "id" of relation "test" violates not-null constraint

有没有办法优雅地处理这个问题,而不必分别执行这两个操作(插入和更新)

谢谢

编辑:

我可以通过在插入之前先做类似的事情来解决这个问题..

UPDATE tmp_tbl SET id = nextval('test_id_seq') WHERE id IS NULL;

但是不知道这是否是最好的或推荐的方法

postgresql sqlalchemy psycopg2 psycopg3
1个回答
0
投票

由于没有人发布解决方案,我使用的解决方案就是我在编辑中提到的。 也就是说,首先使用“next_val”函数使用串行列的新 id 更新 tmp_tbl,然后执行插入。

UPDATE tmp_tbl SET id = nextval('test_id_seq') WHERE id IS NULL;
© www.soinside.com 2019 - 2024. All rights reserved.