需要帮助构建 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 的所有注释。
问题在于表notes
和peers
可能与student
是多对一关系。这意味着您正在尝试过滤 peers
的记录,其中可能有很多笔记和许多同行要比较。
您需要以peers
的每条记录与notes
的单个记录相关联的方式连接所有三个表。如果这不适用于您,那么您需要重新考虑您的真正要求。
也许您想过滤 date_peer_saved 的 MAX >= date_note_saved 的 MAX?
【讨论】:
以上是关于需要帮助构建 SQLAlchemy 查询 + 子查询的主要内容,如果未能解决你的问题,请参考以下文章