SQL Alchemy会话.提交和刷新行为



我正在使用SQL Alchemy处理大型代码库。我们最近改为structlog进行日志记录,SQLAlchemy行为也发生了变化。在将数据插入MySQL的函数中,如果session.commit((调用在日志语句AND之前,而不是在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的基本行为是什么?

SQLAlchemy在提交会话时会使会话中的所有对象过期。也就是说,模型实例的所有列值属性都从其__dict__中删除

这可以通过在创建会话时传递expire_on_commit=False来防止;请注意,过期实例中的数据可能已过时。

最新更新