我正在阅读SqlAlchemy关于postgres方言的upsert操作的文档http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#insert-on-conflict-upsert
有没有办法知道upsert是插入的还是更新的?
文档似乎忽略了这个细节。

最佳答案

只需添加最后一个RETURNING子句:

...
RETURNING (tbl.xmax = 0) AS inserted

对于插入的行返回true,对于更新的行返回false。不过,这依赖于一个未记录的实现细节。有关详细说明,请参见:
Detect if the row was updated or inserted
PostgreSQL Upsert differentiate inserted and updated rows using system columns XMIN, XMAX and others
添加oid(就像在另一个答案中建议的那样)会增加成本、使表膨胀并烧掉oid(如果表不是很小的话)。这就是为什么default_with_oids的一般设置在很久以前就被更改为off的原因(Postgres 8.1)。Quoting the manual:
在用户表中使用oid被认为是不推荐的,因此大多数
安装时应禁用此变量。应用程序
特定表的require oid应该指定WITH OIDS何时
正在创建表。

关于python - 如何在sqlalchemy INSERT…ON CONFLICT(Upsert)中区分冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51247201/

10-12 17:50