我有一部分代码执行以下操作:
现在,从数据库获取结果时,需要发生特定的事情顺序。执行调用时,应创建发票,例如,length
,它等于当前的发票和从API获得的发票。对于从数据库(客户)获得的数据,应该更改相同的length
。
第二次API调用有时“失败”,从某种意义上说,交易未获批准,因此大部分流程都不会发生:发票创建,大多数数据条目的修改。应该生成的一个条目是存储在db中的失败消息,其中包含从查询中获取的数据(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调用成功时,一切正常。当第二个失败时,我仍然需要一个数据库条目,但由于我已经更改了现有数据(customer
,group
)的数据,因此添加了session
的内容,通过except子句中的最后一次提交,这不是我想要的。我只需要newClassOne
和一些数据,例如customer
子句中获得的try
ID。
我找到rollback()
和一些类似的方法,但无法确定我应该使用哪一种方法,因为我对sqlalchemy
和session
存储相对较新,并且文档对我的知识水平来说似乎有点过于复杂。
由于
答案 0 :(得分:0)
我通过重新排序在代码中执行的操作来处理这个问题: