是否可以在 SQLAlchemy 事务中提交两个相关表?
Is it possible to commit two related tables in a SQLAlchemy transaction?
我正在通过 Flask-SQLAlchemy 使用更高级别的 SQLAlchemy ORM。我希望能够创建多个 table,然后在单个事务中提交它们。但是,一个 table 与所有其他 table 相关,我不确定如何在它实际存在之前扩散它的 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
的值?
只需在创建您的 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()
我正在通过 Flask-SQLAlchemy 使用更高级别的 SQLAlchemy ORM。我希望能够创建多个 table,然后在单个事务中提交它们。但是,一个 table 与所有其他 table 相关,我不确定如何在它实际存在之前扩散它的 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
的值?
只需在创建您的 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()