当前位置: 首页 > 面试题库 >

如何在SQLAlchemy中将joinedload / contains_eager用于启用查询的关系(lazy =“ dynamic”选项)

楚宪
2023-03-14
问题内容

我有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())

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

使用这些模型,我尝试joinedloadUser.posts,但是遇到了错误:

>>> 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")


 类似资料:
  • 问题内容: 我有2个模型Recording和Recording_results像这样 我需要获取其中不包含record_results并具有条件的记录项目列表(Recording.user_id == id,Recording.deletedd ==无,RecordingResult.deletedd ==无) 我用这个查询 并且它过滤掉了,但似乎join方法不包括具有空recording_res

  • 问题内容: 我有一个查询,看起来像这样: 这是一个非常基本的查询。除了提取Item的值之外,我还想将其他值添加到混合中,然后将其返回给我。在原始SQL中,我会这样做: 如何通过sqlalchemy手动添加该值? 问题答案: 您需要使用,看起来有点像这样: 注意,该参数无需任何转换即可插入查询;如果您从应用程序外部接受text参数的值,则可能使您暴露于SQL Injection漏洞。如果这是您需要的

  • 问题内容: 我创建了一个用于创建表达式的函数 现在,当我用 然后就可以了 但是当我通过时 然后,它给出错误,即abc不是列。 我试图将其转换 但这是行不通的。 如果我打电话给我 有没有办法获取operator1的类型,并在此基础上创建能够映射到相同内容类型的literal_colum? 问题答案: 任何文字值都可以转换为表达式构造:

  • 问题内容: 嗨,我想使用joinedload对查询进行过滤。但是我似乎无法使其正常工作。以下是我的示例查询 运行此命令时,它返回的行超出了我的期望。实际结果应仅返回8行。但是执行此查询后,它返回234行,这比我预期的要多 问题答案: 它不起作用的原因是(以及所有其他关系加载技术)是完全透明的。也就是说,在查询中包含a不会导致填充关系,而不会以任何其他方式影响它。您应该阅读“加入渴望的禅宗”,其开头

  • 问题内容: 我已经使用预备语句尝试了几次,但是它返回SQL异常。这是我的代码: 运行此程序时,出现以下SQL异常: 有什么建议可以使这项工作吗?任何代码都值得赞赏。 问题答案: 您需要使用: 代替 当您将字符串传递给 该 查询时,将按字面意义执行查询,因此将其发送到数据库,然后数据库会产生错误。通过传递查询字符串,您不会执行传递值的“已缓存”准备语句。

  • 问题内容: 我可以在我的桌子上查询未分配邀请的所有席位: 但是,当查询分配了邀请的所有座位时,我得到了: 这是我的课: 如何查询所有者不为空的所有席位? 问题答案: 该方法采用一系列关键字参数,因此你始终必须使用它。 你要使用允许的方法:

  • 我有一个密码查询,它应该返回节点和边,这样我就可以在web应用程序中呈现我的图形的表示。我使用Neo4joOperations中的方法运行它。 之前,我使用的是spring数据neo4j 3.3。1使用嵌入式数据库,此查询在返回具有开始节点和结束节点的关系代理方面做得很好。我已经升级到SpringDataNeo4J4.0。0并切换到使用远程服务器,现在它返回的LinkedHashMaps非常空。

  • 问题内容: 我用来从表中获取数据。现在,从称为的表中获取所有记录正在按预期方式工作。 现在,我希望对多个列执行查询,如下所示: 但这给LIKE带来了错误。我怎样才能做到这一点? 问题答案: 请像运营商一样使用 http://docs.sqlalchemy.org/en/rel_0_9/core/sqlelement.html#sqlalchemy.sql.operators.ColumnOpera