python 由于约束失败,多个插入失败并出现IntegrityError

a14dhokn  于 2023-11-15  发布在  Python
关注(0)|答案(1)|浏览(116)

使用Python(SQLAlchemy)和MariaDB,我尝试执行三次插入,其中第三次插入的约束要求前两次插入成功。然而,目前第三次插入失败,除非前两次插入已经提交。我想在一个事务中执行所有三次插入,如果发生错误则回滚。
代码如下所示:

  1. try:
  2. ulcdb.add_person(uid, lang)
  3. ulcdb.add_group(gid, gid_number)
  4. ulcdb.add_membership(uid, gid, 'owner')
  5. ulcdb.commit()
  6. except Exception as e:
  7. ulcdb.rollback()
  8. logger.error(str(e))
  9. raise

字符串
其中ulcdb是以下类的示例:

  1. class UserLifecycleDatabase:
  2. def __init__(self):
  3. engine = sqlalchemy.create_engine(url)
  4. Session = sqlalchemy.orm.sessionmaker(bind=engine)
  5. self.session = Session()
  6. def commit(self):
  7. self.session.commit()
  8. def rollback(self):
  9. self.session.rollback()
  10. def add_person(self, uid, lang):
  11. self.session.add(Person(uid=uid, lang=lang))
  12. ...


如果我提交了前两个插入,那么第三个也会成功。我做错了什么?

u3r8eeie

u3r8eeie1#

解决方案是在插入后运行session.flush()而不是session.commit()。这样,满足约束所需的信息就可以提供给会话,并且第三次插入成功。然后可以提交整个事务。但是,如果发生异常,则可以回滚任何成功的插入。

相关问题