Sqlalchemy add_all() 忽略重复键 IntegrityError

我正在将对象列表添加entries到数据库中。有时可能会发生此对象之一已经在数据库中(我对此没有任何控制权)。只有一个IntegrityError所有的事务都会失败,即所有的对象都entries不会被插入到数据库中。


try:

    session.add_all(entries)

    session.commit()

except:

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

    session.rollback()

    raise

finally:

    session.close()

我想要的行为是:如果IntegrityError其中一个有 a entries,捕获它并且不将该对象添加到数据库中,否则正常继续(不要失败)


我使用 MySQL 作为后端。


杨魅力
浏览 264回答 2
2回答

慕尼黑5688855

我取决于你使用的后端。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' }, ...]等等。

杨__羊羊

我找到的解决方案是在添加之前查询数据库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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python