2014-01-17 4 views
0

У меня есть часть кода, который делает следующее:Удаление объектов из SQLAlchemy сессии

  • получить данные из базы данных
  • выполнить вызов API к одному серверу
  • выполнить другой API вызов другой сервер
  • магазин результаты в базе данных (новые данные и изменение существующих)

теперь, когда получение результатов из базы данных, есть определенный порядок вещей, которые должны быть выполнены. Когда вызовы выполняются, счет должен быть создан с, скажем, length, который равен текущему и полученному из API. То же самое length следует изменить на данные, полученные из базы данных (клиента).

Второй вызов API иногда «сбой», в некотором смысле, что транзакция не одобрена, поэтому большая часть процесса не должна выполняться: создание счета, изменение большинства записей данных. Одной записью, которая должна быть сгенерирована, является сообщение об ошибке, которое хранится в db, которое содержит данные, полученные из запроса (id, length и т. Д.).

Итак, я попытался решить эту проблему с помощью 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 и некоторые данные, например ID customer, полученные в статье try.

Я нашел rollback() и некоторые similarmethods, но не могу понять, какой из них я должен использовать, как я был относительно новым sqlalchemy и session хранения и документация кажется немного слишком сложной для моего уровня знаний там ,

Благодаря

ответ

0

я обращался на этот вопрос переназначения как дела выполняются в течение кода:

  • первого вызова API, если это не удается, он ломает цикл и создает запись отказа в БД
  • второго вызова API, если это не удается, он создает уведомление и генерирует другой код, но цикл продолжается
  • обновления существующих записей
  • совершения изменений с в базе данных
Смежные вопросы