如何禁用 SQLAlchemy 的延迟加载?

How to disable SQLAlchemy´s lazy loading?

我正在开发一个 python 应用程序,它使用 Flask-SQLAlchemy 和 ORM Mapper。
我有两个具有多对一关系的 table。主要问题是我想用一个连接查询加载两个对象的内容,而不是稍后,当我访问子 table 的对象时。 我已经尝试通过使用这样的 joinedload 选项来获得这些行为:

Event.query.filter(Event.timestamp == day)
.join(Event.user)
.options(joinedload(Event.user))
.all()

还尝试在实体-class 中为关系设置 lazy="joined" 属性,但没有造成任何差异。

SQL 查询看起来正确并且正确生成了连接,但是如果我稍后访问用户属性,则会发送另一个连接查询。对于其他策略,它也不起作用,例如 contains_eager 选项。
所以预期的行为是,在第一次加载时保存所有信息,以后不执行查询。

所有 SQLAlchemy 选项均为默认选项,DATABASE_URI 除外。是否有任何全局选项可以禁用此行为或覆盖默认值?

实体如下:

class Event(db.Model):
    __tablename__ = "event"
    __table_args__ = (
        db.ForeignKeyConstraint(
            ["username", "userfirstname"], ["users.name", "users.firstname"]
        ),
    )
    timestamp = db.Column(db.Date, primary_key=True, index=True)
    username= db.Column(db.String, primary_key=True)
    userfirstname= db.Column(db.String, primary_key=True)
    ...

    user = db.relationship("UserEntity")

class UserEntity(db.Model):
    __tablename__ = "users"
    name= db.Column(db.String, primary_key=True)
    firstname= db.Column(db.String, primary_key=True)
    ...

试试这个

class Event(db.Model):
    __tablename__ = "event"
    __table_args__ = (
        db.ForeignKeyConstraint(
            ["username", "userfirstname"], ["users.name", "users.firstname"]
        ),
    )
    timestamp = db.Column(db.Date, primary_key=True, index=True)
    username= db.Column(db.String, primary_key=True)
    userfirstname= db.Column(db.String, primary_key=True)
    user = db.relationship("UserEntity", back_populates="events")
    user_id = Column(Integer, ForeignKey('user.id'))
    

class UserEntity(db.Model):
    __tablename__ = "users"
    name= db.Column(db.String, primary_key=True)
    firstname= db.Column(db.String, primary_key=True)
    events = relationship(MyOtherClass, lazy='joined')
    

来自 sqlalchemy 文档:

joined applies a JOIN to the given SELECT statement so that related rows are loaded in the same result set. Joined eager loading is detailed at Joined Eager Loading. 

我发现了错误。禁用延迟加载的基本想法是正确的,而且效果很好。我只是在验证步骤中弄乱了对象引用并破坏了 SQLAlchemy 后台逻辑。