我想在一个表中插入多个项目,并在发生冲突时重新插入该表。这就是我想出的如下方法
from sqlalchemy.dialects.postgresql import insert
meta = MetaData()
jobs_table = Table('jobs', meta, autoload=True, autoload_with=engine)
stmt = insert(jobs_table).values(jobs)
stmt.on_conflict_do_update(
index_elements=['j_id'],
set_= dict(active=True)
)
result = engine.execute(stmt)
return result.is_insert
j_id
是一个唯一的字段,如果该行已经存在,我会尝试更新它。如果该行已经存在,我会得到以下错误。
(psycopg2.IntegrityError) duplicate key value violates unique constraint "j_id"
DETAIL: Key (j_id)=(0ea445da-bd1d-5571-9906-0694fa85728a) already exists.
我是不是漏掉了什么?
发布于 2021-03-29 15:24:55
stmt.on_conflict_do_update
返回一个新语句。如果您更改为以下内容,则它应该可以工作:
from sqlalchemy.dialects.postgresql import insert
meta = MetaData()
jobs_table = Table('jobs', meta, autoload=True, autoload_with=engine)
stmt = insert(jobs_table).values(jobs)
stmt = stmt.on_conflict_do_update(index_elements=['j_id'],
set_= dict(active=True))
result = engine.execute(stmt)
return result.is_insert
您可以对这些语句执行print(stmt)
操作,以查看结果SQL查询。这对于查看要执行的语句是否具有预期的表达式非常有用。此外,向create_engine
添加echo=True
有助于检测问题!
https://stackoverflow.com/questions/66683873
复制相似问题