需要帮助构建 SQLAlchemy 查询 + 子查询

Posted

技术标签:

【中文标题】需要帮助构建 SQLAlchemy 查询 + 子查询【英文标题】:Need help building an SQLAlchemy query + subquery 【发布时间】:2011-06-13 11:01:53 【问题描述】:

这是我需要 SQLAlchemy 通过其 ORM 生成的 SQL。

SELECT
    *
FROM
    notes
WHERE
    notes.student_id == student_id 
  OR
    notes.student_id IN (
        SELECT
            *
        FROM
            peers
        WHERE
            peers.student_id == student_id
          AND
            peers.date_peer_saved >= notes.date_note_saved
    )

SQL 未经测试。我只是写它来演示我需要 SQLAlchemy 做什么。

基本上,登录的学生应该会看到已保存的notes 列表。然而,学生应该看到的唯一notes 是他们自己或他们的同龄人发布的那些 - 但只有那些在保存笔记后他们“加为好友”的同龄人。

这样,学生在成为同龄人之前就不会看到其他学生发布的笔记。

但是,我无法让它在 SQLAlchemy 的 ORM 中运行。有什么帮助吗?

【问题讨论】:

【参考方案1】:

基本上,您可以使用.subquery() 方法获取一个子查询,您可以将其放入另一个类似的条件中。

类似

subq = sess.query(Peers.id).filter(and_(Peers.student==student, XXX)).subquery()

然后

notes = sess.query(Notes).filter(or_(Notes.student==student, Notes.studing.in_(subq))).all()

(也未经测试,可能不适用于这个实际查询,但只是为了给你一个想法)。

【讨论】:

【参考方案2】:

这可能是因为查询有问题。

您似乎想查看date_peer_saved 为 >= date_note_saved 的学生 ID 的所有注释。

问题在于表notespeers 可能与student 是多对一关系。这意味着您正在尝试过滤 peers 的记录,其中可能有很多笔记和许多同行要比较。

您需要以peers 的每条记录与notes 的单个记录相关联的方式连接所有三个表。如果这不适用于您,那么您需要重新考虑您的真正要求。

也许您想过滤 date_peer_saved 的 MAX >= date_note_saved 的 MAX?

【讨论】:

以上是关于需要帮助构建 SQLAlchemy 查询 + 子查询的主要内容,如果未能解决你的问题,请参考以下文章

是否有使用 Sqlalchemy 的 Flask 动态查询构建器?

SQLAlchemy 查询 - 动态类选择

在 sqlalchemy python 中构建动态过滤器

SqlAlchemy 和 Flask,如何查询多对多关系

如何使用 SqlAlchemy 按 id 查询数据库?

将 SqlAlchemy group_by/func 查询转换为 GraphQL