2016-07-06 11 views
0

Im Moment habe ich die folgende Abfrage:Explizit angeben "FROM" Tabelle

query = self.session.query(Student, School).join(
    Person.student, aliased=True).join(
    Student.school, aliased=True).filter(
    Person.id == 1) 

Welche diese SQL kompiliert.

SELECT student.id AS student_id, student.school_id AS student_school_id, student.person_id AS student_person_id, school.id AS school_id, school.name AS school_name 
FROM student, school, person JOIN student AS student_1 ON person.id = student_1.person_id JOIN school AS school_1 ON school_1.id = student_1.school_id 
WHERE person.id = :id_1 

Ich möchte die Abfrage genau so bleiben, wie es ist, aber ich möchte, dass die von Aussage ausschließlich aus dem Person Modell. So etwas wie

SELECT * FROM person JOIN ... WHERE person.id = :id_1 

ich denke, die aliased kwarg wird, um die von Zustand vermasselt. Entfernen der aliased Kwarg behebt das Verhalten, aber ich brauche die Alias-Kwarg für spezielle Anwendungsfälle. Wie kann ich die student und school Tabellen von der "FROM" Anweisung entfernen.

Antwort

2

Das aliased Argument .join verwendet anonymes Aliasing, das heißt die Student und School Sie session.query passieren sind verschiedene ‚Instanzen‘ der Tabelle.

from sqlalchemy.orm import aliased 

aliased_student = aliased(Student) 
aliased_school = aliased(School) 

query = (
    session.query(aliased_student, aliased_school) 
    .select_from(Person) 
    .join(aliased_student, Person.student) 
    .join(aliased_school, Student.school) 
    .filter(Person.id == 1)) 

Hier können Sie sehen, dass Sie .join welche alias sagen kann, wenn sie einer Beziehung Beitritt zu verwenden.

Verwandte Themen