python - SQLAlchemy:禁用延迟加载并仅在 join() 上加载对象

标签 python sqlalchemy

我正在努力禁用 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()

enter image description here

最佳答案

默认relationship loading strategy是“延迟加载”,它按照您想要的方式工作;仅当 Event 对象的 user 属性被触摸时,才会加载相关的 User。在您的情况下,当 IDE 检查对象以便将属性显示为方便的树时,它会被 IDE 触摸,并触发提取。同happens easily with custom __repr__() implementations ,如果不小心的话。

当您希望使用连接预先加载相关用户时,可以使用 joined loading :

some_session.query(Event).options(joinedload(Event.user)).all()

或者,如果您希望在同一查询中根据用户进行过滤,explicit join(s) and contains_eager() :

some_session.query(Event).join(Event.user).options(contains_eager(Event.user)).all()

关于python - SQLAlchemy:禁用延迟加载并仅在 join() 上加载对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53987267/

相关文章:

python - headless Selenium 突然停止工作

python - lighttpd、mod_rewrite 和 web.py 意外行为

python - 修改冷却装饰器以用于方法而不是函数

python - 如何在 MySQL、Pandas 和 SQLAlchemy 的 proc 调用中正确传递参数?

java - 在 pyspark 中包装一个 java 函数

python - SQLAlchemy 多对多关系返回重复的子项

python - sqlalchemy.exc.ResourceClosedError : This transaction is closed 错误

python - Flask-Marshmallow 的 init_app() 真的有必要吗?

mysql - 使用 sqlalchemy 测量 mysql-server 上的插入时间和查询时间

python - 使用 IDLE 运行 Python PyUnit 单元测试