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

dav*_*ave 5 python sql sqlalchemy subquery

这是我需要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
    )
Run Code Online (Sandbox Code Playgroud)

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

基本上,登录的学生应该看到已保存的列表notes.notes然而,唯一的学生应该看到的是那些由他们自己发布的或者由他们的同伴发布的那些 - 但只有那些同意他们在说明被保存之后'结识'.

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

但是,我无法在SQLAlchemy的ORM中运行它.有帮助吗?

Kei*_*ith 8

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

就像是

subq = sess.query(Peers.id).filter(and_(Peers.student==student, XXX)).subquery()
Run Code Online (Sandbox Code Playgroud)

然后

notes = sess.query(Notes).filter(or_(Notes.student==student, Notes.studing.in_(subq))).all()
Run Code Online (Sandbox Code Playgroud)

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


map*_*aft 0

这可能是因为查询存在问题。

看起来您想查看学生 ID 的所有笔记,其中date_peer_saved>= date_note_saved

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

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

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