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

在SQL Alchemy中过滤关系

贡俊
2023-03-14
问题内容

我有以下情况:

class Author(Base):
  __tablename__ = 'author'

  id    = Column(Integer, primary_key = True)
  name  = Column(String)

  books = relationship('Books', backref='author')


class Book(Base):
  __tablename__ = 'book'

  id    = Column(Integer, primary_key = True)
  title = Column(String)

我想做的是加载所有在书名中包含SQL的作者。即

authors = session.query(Author)\
                 .join(Author.books)\
                 .filter(Book.title.like('%SQL%')\
                 .all()

看起来很简单。

然后,我想做的就是遍历作者并展示他们的书。我希望访问authors [0] .books时,它只会返回标题中带有“
SQL”的书籍。但是,我正在将所有书籍分配给该作者。当我访问该关系时,该过滤器将应用于作者列表,而不是其书籍。

如何构造查询,以便在按关系(即书籍)进行过滤时,当我访问该关系时,仍会应用该过滤?


问题答案:

请阅读将明确的联接/语句路由到渴望加载的集合中。然后,contains_eager您可以使用来构造查询并确切获得所需内容:

authors = (
        session.query(Author)
        .join(Author.books)
        .options(contains_eager(Author.books)) # tell SA that we load "all" books for Authors
        .filter(Book.title.like('%SQL%'))
    ).all()

请注意,您实际上是在诱使sqlalchemy认为它已加载的所有集合Author.books,因此您的会话将知道false有关真实状态的信息。



 类似资料:
  • 问题内容: 我在SQLAlchemy上没有太多经验,并且有一个我无法解决的问题。我尝试搜索,并且尝试了很多代码。这是我的课程(简化为最重要的代码): 我想查询所有母亲的phenoscore为(例如)的患者 如前所述,我尝试了很多代码,但我不明白。在我看来,合乎逻辑的解决方案是 因为,您可以在输出时访问每个元素,但是此代码不执行此操作。 是否有(直接)按关系的属性进行过滤的可能性(无需编写SQL语句

  • 问题内容: 我有一个使用SA的 association_proxy 建模 的多对多 (开发人员和项目)关系。集合(每个项目的开发人员和每个开发人员的项目)工作正常,但我需要过滤关联本身的属性(状态)。像这样的东西(不起作用): __ 我想念什么?这是完整的测试代码: 问题答案: 关联代理的使用方法:

  • 问题内容: 我正在寻找一种使用SQLAlchemy动态构造过滤器的方法。也就是说,给定该列,运算符名称和比较值,即可构造相应的过滤器。 我将尝试使用一个示例进行说明(这将用于构建API)。假设我们有以下模型: 我想将查询映射到过滤器。例如, 应该产生 应该产生 我环顾四周,看看它是如何完成的,但是找不到一种不涉及手动将每个运算符名称映射到比较器或类似名称的方法。例如,Flask- Restless

  • 问题内容: 我刚刚开始使用SQLAlchemy。我决定使用它,因为我在sqlite查询中间使用了很多字符串表达式。 所以,这就是我的问题。我的桌子上有很多设备,每个设备都有维护级别的日期。关键是用户可以选择他想在屏幕上看到的维护级别。因此,我应该为他选择的每种维护级别组合“调整”我的SQLAlchemmy。 例如,在原始SQLite中。 SELECT * WHERE(设备IN [])和m_leve

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

  • 问题内容: 如何按字符串长度过滤? 此代码段: 给了我以下错误: 在哪里: 问题答案: 您需要使用SQL函数生成器来创建函数: