我正在努力禁用 SQLAlchemy 上的延迟加载,因此在从数据库中获取记录时,默认情况下它不会加载所有对象。例如,当您专门将事件对象加入查询或访问它(例如event.user )时,我尝试仅从事件对象加载用户对象。这是否可以通过参数以某种方式实现,或者禁用延迟加载是一个不好的做法吗?
我已经尝试过 noload("*") 但它会禁用最后的任何连接。例如,我有以下模型以及我正在执行测试的查询。
# Event model
class Event(Base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50), nullable=False)
amount = Column(Integer)
_user_id = Column("user_id", Integer, ForeignKey("users.id"), nullable=False)
user = relationship(User)
# Query - This fetches also the whole user object <-- I don't want such behavior
some_session.query(Event).all()
# Query - I would like to load the user object when I will use the join() if possible
some_session.query(Event).join(Event.user).all()
Run Code Online (Sandbox Code Playgroud)
默认的关系加载策略是“延迟加载”,它按照你想要的方式工作;仅当触摸对象的属性User时才会加载相关内容。在您的情况下,当 IDE 检查对象以便将属性显示为方便的树时,它会被 IDE 触摸,并触发提取。如果不小心的话,自定义实现很容易发生同样的情况。userEvent__repr__()
当您希望使用连接预先加载相关用户时,可以使用连接加载:
some_session.query(Event).options(joinedload(Event.user)).all()
Run Code Online (Sandbox Code Playgroud)
或者,如果您希望根据User同一查询中的显式连接和contains_eager()进行过滤:
some_session.query(Event).join(Event.user).options(contains_eager(Event.user)).all()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9806 次 |
| 最近记录: |