为了账号安全,请及时绑定邮箱和手机立即绑定

Sqlalchemy add_all() 忽略重复键 IntegrityError

Sqlalchemy add_all() 忽略重复键 IntegrityError

杨魅力 2023-06-20 15:16:01
我正在将对象列表添加entries到数据库中。有时可能会发生此对象之一已经在数据库中(我对此没有任何控制权)。只有一个IntegrityError所有的事务都会失败,即所有的对象都entries不会被插入到数据库中。try:    session.add_all(entries)    session.commit()except:    logger.error(f"Error! Rolling back")    session.rollback()    raisefinally:    session.close()我想要的行为是:如果IntegrityError其中一个有 a entries,捕获它并且不将该对象添加到数据库中,否则正常继续(不要失败)我使用 MySQL 作为后端。
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我取决于你使用的后端。

PostgreSQL有一个很棒的INSERT() ON CONFLICT DO NOTHING子句,您可以将其与 SQLAlchemy 一起使用:

from sqlalchemy.dialects.postgresql import insert
session.execute(insert(MyTable)
                .values(my_entries)
                .on_conflict_do_nothing())

MySQL有类似的INSERT IGNORE条款,但 SQLAlchemy 对它的支持较少。

session.execute(MyTable.__table__
                .insert()
                .prefix_with('IGNORE')
                .values(my_entries))

唯一的事情是my_entries需要一个列到值映射的列表。这意味着[{ 'id': 1, 'name': 'Ringo' }, { 'id': 2, 'name': 'Paul' }, ...]等等。


查看完整回答
反对 回复 2023-06-20
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我找到的解决方案是在添加之前查询数据库


try:

    instance = session.query(InstancesTable).filter_by(id=entry.id).first()

    if instance:

        return

    session.add(entry)

    session.commit()

except:

    logger.error(f"Error! Rolling back")

    session.rollback()

    raise


查看完整回答
反对 回复 2023-06-20
  • 2 回答
  • 0 关注
  • 249 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信