是否可以在 SQLAlchemy 事务中提交两个相关表?

max*_*man 5 python sqlalchemy flask-sqlalchemy

我通过 Flask-SQLAlchemy 使用更高级别的 SQLAlchemy ORM。我希望能够创建多个表,然后在单个事务中提交它们。然而,一个表与所有其他表相关,我不确定如何在它实际存在之前增加它的 ID。(请注意,它的主键是一个自动递增的值,直到我们实际执行 SQL 时才存在。)

例如,假设我们有TableA和TableB。TableB有一个名为 的专栏table_a_id。IDTableA由数据库管理;它会自动递增,并且在我们创建一行TableA.

我希望能够创建TableA并TableB同时在出现问题时回滚事务。

在一个魔法成为可能的完美世界中,我的代码将如下所示:

try:
    a = TableA()
    b = TableB(table_a_id=a.id)  # a.id is None, since nothing has happened yet.
    db.session.commit()
except Exception:
    db.session.rollback()
Run Code Online (Sandbox Code Playgroud)

a.id是否可以通过子交易在交易中填写 的值?

kni*_*tti 8

session.flush()只需在创建对象后使用a,它会在当前事务中发出所有待处理的 SQL,并将填充自动生成的 ID。稍后您可以commit()或rollback()根据需要。