从sqlalchemy会话中删除对象

时间:2014-01-17 13:57:41

标签: python sqlalchemy flask commit rollback

我有一部分代码执行以下操作:

  • 从数据库中获取数据
  • 对一台服务器执行API调用
  • 对另一台服务器执行另一个API调用
  • 将结果存储在数据库中(新数据和现有数据的更改)

现在,从数据库获取结果时,需要发生特定的事情顺序。执行调用时,应创建发票,例如,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调用成功时,一切正常。当第二个失败时,我仍然需要一个数据库条目,但由于我已经更改了现有数据(customergroup)的数据,因此添加了session的内容,通过except子句中的最后一次提交,这不是我想要的。我只需要newClassOne和一些数据,例如customer子句中获得的try ID。

我找到rollback()和一些类似的方法,但无法确定我应该使用哪一种方法,因为我对sqlalchemysession存储相对较新,并且文档对我的知识水平来说似乎有点过于复杂。

由于

1 个答案:

答案 0 :(得分:0)

我通过重新排序在代码中执行的操作来处理这个问题:

  • 第一次API调用,如果失败,则会中断循环并在数据库中创建失败条目
  • 第二次API调用,如果失败,它会创建一个通知并生成不同的代码,但循环继续
  • 更新现有条目
  • 提交对数据库的更改