亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 353 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號