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

Is it possible to commit two related tables in a SQLAlchemy transaction?

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

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

之前不存在

我希望能够同时创建 TableATableB,如果出现任何问题回滚事务。

在一个可以施展魔法的完美世界里,我的代码应该是这样的:

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()

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

只需在创建您的 a 对象后使用 session.flush(),即在当前事务中发出所有未决 SQL 并且 填写自动-生成的 ID。稍后您可以根据需要 commit()rollback()

我有两个 table 一个是 UnserInfo 另一个是 clientInfo。在这种情况下,userInfoId 是 clientInfo table 中的外键。所以首先我保存 userInfo 然后用 userInfo id

保存 clientInfo

我在这里使用 flask、marshmallow、flask-marshmallow、marshmallow-sqlalchemy、SQLAlchemy、flask-sqlalchemy。

我在我的项目中就是这样做的

try:

    userInfo = UserInfo(
       userId=dataUserInfo['mobile'],
       password=dataUserInfo['password'],
       userTypeName='client')

    db.session.add(userInfo)     
    db.session.commit() # save userInfo in database
    dbUserInfoResult = userInfoDto.dump(userInfo).data # get userInfo id from database
    print('dbUserInfoResult.data.id: ', dbUserInfoResult['id'])

    clientInfo = ClientInfo(name=dataClintInfo['name'],
                      mobileCountryCode=dataClintInfo['mobileCountryCode'],
                      mobile=dataClintInfo['mobile'],
                      email=dataClintInfo['email'] if 'email' in dataClintInfo else None,
                      userInfoId=dbUserInfoResult['id'])

    db.session.add(clientInfo)
    db.session.commit()
except Exception:
    db.session.rollback()