我正在将对象列表添加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' }, ...]
等等。
杨__羊羊
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
添加回答
举报
0/150
提交
取消