如何禁用分离实例关系上的 SQLAlchemy 延迟加载?

Posted

技术标签:

【中文标题】如何禁用分离实例关系上的 SQLAlchemy 延迟加载?【英文标题】:How to disable SQLAlchemy lazy loads on detached instance relationships? 【发布时间】:2021-04-14 18:12:07 【问题描述】:

我使用 SQLAlchemy 在 Python 中开发了一个类似 JDO 的 Fetch Group 功能,以控制对象图的修剪以编组 Web 服务响应。

在此过程中,我使用 session.expunge(entity) 分离实例

问题在于,当 JSON 编组器或 pydantic 访问尚未加载的实例属性关系时,即使实例已分离,SQLAlchemy 延迟加载仍会为该属性启动并失败,因为实例未绑定到一个会话了(显然):

DetachedInstanceError("Parent instance <MyClass at 0x1439051f0> is not bound to a Session; lazy load operation of attribute 'relation' cannot proceed")

所以,我的第一个问题是,为什么在分离实例时没有禁用惰性加载程序,因为这对我来说没有意义。

其次,如果这是一个“功能”,我如何禁用或解决延迟加载程序以防止此错误并让相关属性关系对编组器显示为 None?

我发现在某些情况下设置 self.__dict__['relation'] = None 有助于愚弄惰性加载程序,使其不启动,但不幸的是,它并不总是有效...

【问题讨论】:

感谢self.__dict__['relation'] = None! :) 【参考方案1】:

关于第二个问题,您可以使用make_transient(请参阅here)

该函数将删除它与任何会话的关联以及 它的 InstanceState.identity。效果是对象会表现 好像是新建的一样,除了保留任何属性/ 调用时加载的集合值。

【讨论】:

以上是关于如何禁用分离实例关系上的 SQLAlchemy 延迟加载?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQLAlchemy 找出是不是还没有加载惰性关系?

Sqlalchemy:过滤关系中应该有多少个实例

如何禁用SQLAlchemy缓存?

我如何知道是不是可以禁用 SQLALCHEMY_TRACK_MODIFICATIONS?

如何使用 sqlalchemy_utils.dependent_objects()?

SQLalchemy:无法确定关系上的父/子表之间的连接条件