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

Python SQLAlchemy:禁用延迟加载并仅在join()上加载对象,python,sqlalchemy,Python,Sqlalchemy,我正在禁用SQLAlchemy上的延迟加载,因此在从数据库获取记录时,默认情况下不会加载所有对象。例如,当您在查询中专门加入事件对象时,或者如果您访问它(例如event.user),我尝试仅从事件对象加载用户对象。这是否可能通过参数实现,或者禁用延迟加载是一种不好的做法 我已经尝试过noload(“*”),但它在最后禁用了任何连接。 例如,我有下面的模型和我正在进行测试的查询 # Event model class Event(Base): __tablename__ = 'events

我正在禁用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()
事件模型 类事件(基本): __tablename_uu='events' id=列(整数,主键=True,自动递增=True) name=Column(字符串(50),null=False) 金额=列(整数) _user\u id=Column(“user\u id”,Integer,ForeignKey(“users.id”),nullable=False) 用户=关系(用户) #查询-这也会获取整个用户对象默认值为“延迟加载”,它按照您想要的方式工作;仅当触摸
事件
对象的
用户
属性时,才会加载相关的
用户
。在您的例子中,当IDE检查对象以将属性显示为一个方便的树时,它会被您的IDE所触动,这会触发获取。同样的,如果不小心的话

如果希望使用联接加载相关用户,请使用:

或者,如果您希望根据同一查询中的
用户
进行筛选,则:


@IljaEverilä是的,这是真的。我同意,因为默认值是lazy=“select”,但当我执行查询以获取所有事件时,我加载了整个用户对象,而没有执行任何事件。例如user。我还将修改标题,以免混淆people@IljaEverilä我发布了一张图像,在执行查询时向我显示结果集中的用户对象。没有加载吗?@IljaEveriläI在特定对象上没有任何_repr__()或input。我有一个执行查询的函数above@IljaEveril很好。谢谢你提供的信息,因为我是sqlalchemy的新手,你帮了我很多。我会看看你给我的那个帖子。因此,为了加载用户对象,我必须使用.join(Event.user),这将加载对象?遵循与提供的链接中相同的_repr_____;(),这表示用户未加载,并且当我使用contains_时,它显示要加载的对象。非常感谢你的帮助。
some_session.query(Event).options(joinedload(Event.user)).all()
some_session.query(Event).join(Event.user).options(contains_eager(Event.user)).all()