У меня есть часть кода, который делает следующее:Удаление объектов из 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
хранения и документация кажется немного слишком сложной для моего уровня знаний там ,
Благодаря