我正在將對象列表添加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
提交
取消