需要帮助构建SQLAlchemy查询和子查询
这是我希望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
,或者是他们的朋友发布的那些notes
,但前提是这些朋友是在笔记保存之后才加为好友的。
这样一来,学生就看不到在他们成为朋友之前,其他学生发布的笔记。
不过,我在SQLAlchemy的ORM中运行这个时遇到了问题。有没有人能帮帮我?
2 个回答
0
这可能是因为查询有问题。
看起来你想查看某个学生的所有笔记,条件是 date_peer_saved
要大于等于 date_note_saved
。
问题在于,notes
表和 peers
表可能和 student
表之间是多对一的关系。这意味着你在尝试筛选 peers
表的记录,而这些记录可能有很多笔记和很多同伴需要比较。
你需要把这三张表连接起来,让每条 peers
的记录都能对应到一条 notes
的记录。如果这不适用你,那你需要重新考虑一下你真正想要的是什么。
也许你想要筛选的是 date_peer_saved
的最大值大于等于 date_note_saved
的最大值?
8
基本上,你可以使用 .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()
(这个方法也没有经过测试,可能在这个具体查询中不适用,但只是为了让你明白这个思路)。