如何禁用 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 后台逻辑。
我正在开发一个 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 后台逻辑。