2011-06-13 12 views
5

Este es el SQL que necesito que SQLAlchemy genere a través de su ORM.Necesita ayuda para generar una consulta + subconsulta de SQLAlchemy

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 
    ) 

El SQL no se ha probado. Lo escribí para mostrar lo que necesito que haga SQLAlchemy.

Básicamente, el estudiante conectado debe ver una lista de guardados notes. Sin embargo, los únicos notes que debe ver el alumno son los que publican ellos mismos o los publicados por uno de sus pares, pero solo aquellos pares a quienes "dieron su amistad" después de que la nota se hubiera guardado.

De esta manera, un alumno no verá notas publicadas por otro alumno antes de convertirse en compañeros.

Tengo problemas para ejecutar esto en el ORM de SQLAlchemy, sin embargo. ¿Alguna ayuda?

Respuesta

0

Esto es probablemente porque hay problemas con la consulta.

Parece que desea ver todas las notas para una identificación de estudiante donde date_peer_saved es> = date_note_saved.

El problema es que las tablas notes y peers son probablemente una relación muchos a uno con student. Lo que esto significa es que está tratando de filtrar registros de peers donde puede haber muchas notas y muchos pares para comparar.

Debe unir las tres tablas de tal manera que cada registro de peers se relacione con un solo registro de notes. Si esto no se aplica a usted, entonces debe reconsiderar lo que realmente está pidiendo.

Quizás desee filtrar el MAX de date_peer_saved> = MAX of date_note_saved?

8

Básicamente, puede utilizar el método .subquery() para obtener una consulta secundaria que puede colocar en otro condicional como ese.

Algo así como

subq = sess.query(Peers.id).filter(and_(Peers.student==student, XXX)).subquery() 

Entonces

notes = sess.query(Notes).filter(or_(Notes.student==student, Notes.studing.in_(subq))).all() 

(también probado y puede no funcionar con esta consulta real, pero sólo para darle la idea).

Cuestiones relacionadas