我通过Flask-SQLAlchemy使用更高级别的SQLAlchemy ORM。我希望能够创建多个表,然后在单个事务中提交它们。但是,一个表与所有其他表相关,我不确定如何在ID实际存在之前扩散它。 (请注意,它的主键是一个自动递增值,在我们实际执行SQL之前不会存在。)
例如,我们说TableA
和TableB
。 TableB
有一个名为table_a_id
的列。 TableA
ID由数据库管理;它会自动递增,并且在我们创建一行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()
是否有可能(通过子交易)在交易中填写a.id
的值?
答案 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()