2011-06-05 7 views
12

Estoy utilizando la asignación de ORM en SQLAlchemy 0.6.8.Exterior Únase a la asignación de ORM en SQLAlchemy

Tengo tres tablas (A, B y C), sin claves externas entre ellas.

Estoy tratando de unirse a la tabla A y B, y luego a la izquierda combinación externa que con C. Estoy esperando un llamado tupla, con los campos A, B y C -. Con el campo C a veces en Ninguno)

Puedo hacer la primera unión fácilmente con solo seleccionar ambas tablas.

(session.query(A, B) 
    .filter(A.some_field = B.some_other_field)) 

Eso me consigue un NamedTuple con los campos A y B.

Luego agregar la combinación externa, para que sea:

(session.query(A, B) 
    .filter(A.some_field==B.some_other_field)) 
    .outerjoin((C, A.some_field==C.some_different_field)) 

El resultado sólo cuenta con dos mesas. No puedo acceder a los otros campos de C (incluso en los casos en que están presentes).

¿Cuál es la forma correcta de hacer una combinación externa izquierda, para obtener acceso a los campos de la tabla de la derecha?

Preferiría no recurrir al SQL básico si pudiera evitarlo, estoy tratando de aprender a aprovechar el ORM.

+0

Estoy tratando de averiguar si subconsultas y alias pueden proporcionar una solución, pero no se siente como la dirección correcta. – Oddthinking

Respuesta

14

Esto debería funcionar:

(session.query(A) 
    .join(B, A.some_field == B.some_other_field) 
    .outerjoin(C, A.some_field == C.some_different_field) 
    .add_entity(B) 
    .add_entity(C)) 
0

respuesta tentativa a mi propia pregunta:

Este código parece estar generando el SQL que quiero:

(session.query(A, B, C) 
    .filter(A.some_field==B.some_other_field)) 
    .outerjoin((C, A.some_field==C.some_different_field)) 

Nota la adición del parámetro C a la session.query llamada original.

Esto no parece hacer lo que pensé que haría: A se unió con B se unió con C se unió a C nuevamente.

Todavía estoy a prueba.

Cuestiones relacionadas