Я работаю с большой кодовой базой, используя SQL Алхимия. Недавно мы перешли на structlog для ведения журнала, и поведение SQLAlchemy изменилось. В функциях, где данные вставляются в MySQL, если вызов session.commit () находится перед оператором журнала И не в предложении finally, объект становится None.
model_obj пуст, когда возвращается в следующем код:
model_obj = json.loads(model_serialized, object_hook=from_json)
try:
session.add(model_obj)
session.commit()
config.logger.debug("added model_obj", model_obj=model_obj)
except IntegrityError as e:
config.logger.debug("model_obj already exists", model_obj=model_obj, e=str(e))
return createAndEncodeErrorElements(
ErrorCodeDatabaseSQLAlchemyIntegrityError, None
)
else:
response = createAndEncodeSuccessElementsWithData({model_obj: model_obj})
return response
finally:
session.close()
model_obj НЕ пуст, когда возвращается в следующем коде: model_obj = json .loads (model_serialized, object_hook = from_ json)
try:
session.add(model_obj)
config.logger.debug("added model_obj", model_obj=model_obj)
except IntegrityError as e:
config.logger.debug("model_obj already exists", model_obj=model_obj, e=str(e))
return createAndEncodeErrorElements(
ErrorCodeDatabaseSQLAlchemyIntegrityError, None
)
else:
response = createAndEncodeSuccessElementsWithData({model_obj: model_obj})
return response
finally:
session.commit()
session.close()
Почему session.commit () должен быть в предложении finally? Каково основное поведение SQLAlchemy?