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

2024-10-06 07:59:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,假设我们有TableATableBTableB有一个名为table_a_id的列。TableAID由数据库管理;它会自动递增,直到我们创建一行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的值?在


Tags: id数据库dbsql烧瓶sqlalchemysessionorm
2条回答

我有两张桌子,一张是隐形的另一张是客户信息。在本例中,userInfoId是clientInfo表中的forign键。所以我首先保存userInfo,然后用userInfo id保存clientInfo

在这里我使用烧瓶,棉花糖,烧瓶棉花糖,棉花糖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()

只需在创建a对象之后使用session.flush(),它将发出当前事务中所有挂起的SQL,填充自动生成的id。稍后您可以根据需要commit()或{}。在

相关问题 更多 >