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

时间:2015-05-20 18:27:31

标签: sqlalchemy flask-sqlalchemy

我通过Flask-SQLAlchemy使用更高级别的SQLAlchemy ORM。我希望能够创建多个表,然后在单个事务中提交它们。但是,一个表与所有其他表相关,我不确定如何在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的值?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我有两个表,一个是UnserInfo,另一个是clientInfo。在这种情况下,userInfoId是clientInfo表中的外键。因此,首先我保存userInfo,然后保存带有userInfo id的clientInfo

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