2

我有一个名为 Person 的表,其中包含三个字段 - ID、城市和名称。城市可以为空,所以我有两个部分唯一索引 - 一个在 ID 和城市不为空的城市上,一个在 ID 上,城市为空。

现在我想有一个使用 SQLAlchemy 的 upsert 语句,带有那些部分索引,但我无法弄清楚语法。目前我有:

table = models.Person.__table__
insert_statement = insert(table, upsert_values)
update_dict = {c.name: c for c in insert_statement.excluded if c.name != "id"}
upsert_statement = insert_statement.on_conflict_do_update(
    index_elements=[table.c['id'], table.c['city']],
    set_=update_dict
)

但是当我尝试执行时,我得到

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidColumnReference) 没有与 ON CONFLICT 规范匹配的唯一或排除约束

这怎么行?除了运行纯 SQL 还有其他方法吗?

4

0 回答 0