【问题标题】:bulk insert sqlalchemy core with on conflict update使用冲突更新批量插入 sqlalchemy 核心
【发布时间】:2021-03-18 02:19:59
【问题描述】:

我想在一个表中插入多个项目并在冲突时更新该表。这就是我想出的以下内容

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.

这里有什么我遗漏的吗?

【问题讨论】:

    标签: sqlalchemy upsert on-duplicate-key


    【解决方案1】:

    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 查询。这对于查看您要执行的语句是否具有预期的表达式很有用。将echo=True 添加到create_engine 也有助于检测问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 2016-11-29
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多