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

5 投票
2 回答
9791 浏览
提问于 2025-04-16 19:28

这是我希望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()

(这个方法也没有经过测试,可能在这个具体查询中不适用,但只是为了让你明白这个思路)。

撰写回答