Python 从sqlalchemy会话中删除对象
我有一部分代码可以执行以下操作:Python 从sqlalchemy会话中删除对象,python,sqlalchemy,flask,commit,rollback,Python,Sqlalchemy,Flask,Commit,Rollback,我有一部分代码可以执行以下操作: 从数据库中获取数据 对一台服务器执行API调用 对另一台服务器执行另一个API调用 将结果存储在数据库中(新数据和现有数据的更改) 现在,当从数据库中获取结果时,需要发生的事情有特定的顺序。当执行调用时,应该创建发票,比如说,length,它等于当前发票和从API获得的发票。对于从数据库(客户)获得的数据,应更改相同的长度 第二个API调用有时会“失败”,从某种意义上说,事务未经批准,因此大部分过程都不会发生:发票创建、大多数数据条目的修改。应该生成的一个条
- 从数据库中获取数据
- 对一台服务器执行API调用
- 对另一台服务器执行另一个API调用
- 将结果存储在数据库中(新数据和现有数据的更改)
length
,它等于当前发票和从API获得的发票。对于从数据库(客户)获得的数据,应更改相同的长度
第二个API调用有时会“失败”,从某种意义上说,事务未经批准,因此大部分过程都不会发生:发票创建、大多数数据条目的修改。应该生成的一个条目是存储在数据库中的故障消息,其中包含从查询中获得的数据(id、长度等)
因此,我试图通过伪代码中的try/except
解决这个问题:
try:
customer = Customer.query.filer_by(id=1).first()
group = Groups.query.filer_by(id=1).first()
api_one_call() #returns the LENGTH
customer.length = LENGTH
group.quota += LENGTH
invoice = generate_invoice(LENGTH)
db.session.add(invoice)
api_two_call(ID) #can suceed or fail, and returns ID
newClassOne = ClassOne(ID)
db.session.add(newClassOne)
db.sesion.commit() #have to do this commit to have the id of the newClassOne as that one is included in the next db entry
newCLassTwo =ClassTwo(newClassOne.id)
db.session.add(newClassOne)
db.sesion.commit()
except:
#potentially clean the session data there
newClassOne = ClassOne(ID, faiture)
db.session.add(newClassOne)
db.sesion.commit()
当API调用成功时,一切正常。当第二个失败时,我仍然需要一个DB条目,但由于我已经更改了现有数据的数据(customer
,group
),在会话中添加了内容,这些内容也会在except子句中的最后一次提交中添加,这不是我想要的。我只需要newClassOne
和一些数据,比如在try
子句中获得的customer
的ID
我已经找到了rollback()
和一些类似的方法,但是我不知道应该使用哪种方法,因为我对sqlalchemy
和会话
存储比较陌生,而且文档对于我在那里的知识水平来说似乎有点太复杂了
谢谢我通过重新排序代码执行过程中的情况来处理这个问题:
- 第一个API调用,如果失败,它将中断循环并在DB中创建一个失败条目
- 第二个API调用,如果失败,它将创建一个通知并生成不同的代码,但循环将继续
- 更新现有条目
- 提交对数据库的更改