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调用,如果失败,它将创建一个通知并生成不同的代码,但循环将继续
  • 更新现有条目
  • 提交对数据库的更改