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

时间:2011-06-13 11:01:53

标签: 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
    )

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

基本上,登录的学生应该会看到已保存的notes列表。然而,学生应该看到的唯一notes是他们自己发布的那些或者他们的同伴发布的那些 - 但只有那些同意他们在该笔记被保存后才会“结识”。

通过这种方式,学生在成为同伴之前不会看到其他学生发布的笔记。

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

2 个答案:

答案 0 :(得分: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()

(也是未经测试的,可能无法使用此实际查询,但只是为了提供您的想法)。

答案 1 :(得分:0)

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

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

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

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

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