我有下表:
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;
但是不知道这是否是最好的或推荐的方法
由于没有人发布解决方案,我使用的解决方案就是我在编辑中提到的。 也就是说,首先使用“next_val”函数使用串行列的新 id 更新 tmp_tbl,然后执行插入。
UPDATE tmp_tbl SET id = nextval('test_id_seq') WHERE id IS NULL;