gpt4 book ai didi

python - 如何在 SQLAlchemy 中将 joinedload/contains_eager 用于启用查询的关系(惰性 ='dynamic' 选项)

转载 作者:太空狗 更新时间:2023-10-29 21:21:27 24 4
gpt4 key购买 nike

我有以下由 SQLAlchemy 声明的模型类:

class User(Base):
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
created_at = Colmn(DateTime, nullable=False, default=func.now())

class Post(Base):
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey(User.id), nullable=False)
user = relationship(User, backref=backref('posts', lazy='dynamic'))
title = Column(String, nullable=False)
body = Column(Text, nullable=False)
created_at = Colmn(DateTime, nullable=False, default=func.now())

正如我所引述的,这些模型有一个关系,其名为 posts 的反向引用设置为启用查询(通过 lazy='dynamic' 选项)。因为有些用户可能拥有大量帖子,而大多数用户则没有。

对于这些模型,我为 User.posts 尝试了 joinedload,但我遇到了错误:

>>> users = session.query(User).options(joinedload(User.posts))[:30]
Traceback (most recent call last):
...
InvalidRequestError: 'User.posts' does not support object population - eager loading cannot be applied.

有什么办法可以解决这种情况?我需要以下两个功能:

  • 有时可以对 User.posts 进行切片,以避免急切加载重度用户编写的大量帖子。
  • 但是通常 User.posts 不应产生 1+N 查询。

最佳答案

问题是帖子的 User 属性是一个动态关系;它应该返回一个 Query 对象。属性无法知道或安全地传达这一次所有相关项目都已加载。

简单的解决方法是拥有两个属性,一个使用正常的延迟加载行为(您可以将其设置为对特定查询有意义的预加载),另一个始终返回动态关系。

class User(Base):
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
created_at = Colmn(DateTime, nullable=False, default=func.now())

class Post(Base):
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey(User.id), nullable=False)
user = relationship(User, backref=backref('posts'))
title = Column(String, nullable=False)
body = Column(Text, nullable=False)
created_at = Colmn(DateTime, nullable=False, default=func.now())

User.post_query = relationship(Post, lazy="dynamic")

关于python - 如何在 SQLAlchemy 中将 joinedload/contains_eager 用于启用查询的关系(惰性 ='dynamic' 选项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6935809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com