Нужна помощь в создании запроса SQLAlchemy + подзапрос - PullRequest
5 голосов
/ 13 июня 2011

Это SQL, который мне нужен для генерирования SQLAlchemy через ORM.

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, которое должен видеть студент, это те, которые были отправлены им самим, или сообщения, отправленные одним из его сверстников - но только те сверстники, которых они «подружили» после сохранения заметки.

Таким образом, ученик не увидит заметки, опубликованные другим учеником, прежде чем они станут пэрами.

Однако у меня возникают проблемы с запуском этого в ORM SQLAlchemy. Любая помощь?

Ответы [ 2 ]

8 голосов
/ 13 июня 2011

В принципе, вы можете использовать метод .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()

(также не проверено и может не работать с этим фактическим запросом, но только для того, чтобы дать вам идею).

0 голосов
/ 13 июня 2011

Возможно, это связано с проблемами в запросе.

Похоже, что вы хотите увидеть все заметки для идентификатора студента, где date_peer_saved -> = date_note_saved.

Проблема в том, что таблицы notes и peers, вероятно, имеют отношение "многие к одному" с student. Это означает, что вы пытаетесь отфильтровать записи peers, где может быть много заметок и много пиров для сравнения.

Вам необходимо объединить все три таблицы таким образом, чтобы каждая запись peers относилась к одной записи notes. Если это не относится к вам, вам нужно переосмыслить то, что вы действительно просите.

Возможно, вы хотите отфильтровать MAX для date_peer_saved> = MAX для date_note_saved?

...