0

Ich erzeuge eine Abfrage mit SQL Alchemie Teil für Teil. Ich habe dieses Objekt, das sehr gut für eine Abfrage mit nur einem Join funktioniert:Abfrage mehrere Joins sqlalchemy

** Ich habe ein ORM-Modell, aber ich kann nicht verwenden Primärschlüssel Seted, weil nicht real sind.

q = select(self.selectObj._select 
    ).select_from(
     self.joinObj._join 
    ).where(
     and_(*self.whereObj._where) 
    ).group_by(
     *self.selectObj._groupby 
    ).order_by(
     self.selectObj._orderby 
    ).limit(
     self.selectObj._limit 
    ).having(
     self.selectObj._having 
) 

ich diese Methode haben für erzeugen die Verbindungen:

def get_joins(self, first, leftTable, rightTable, leftTableColumn, rightTableColumn, outer): 
    if first: 
     self._join = join(leftTable, rightTable, leftTableColumn == rightTableColumn, full=outer) 
     first = False 
    else: 
     self._join = self._join + join(leftTable, rightTable, leftTableColumn == rightTableColumn, full=outer) 

Ich weiß es nicht, wie kann ich generieren, verketten, erhalten sie, etc zwei oder mehr schließt sich für sie in der select_from Klausel Gebrauch . Irgendeine Idee?

Vielen Dank im Voraus :)

Das Endergebnis wie dies in dem von sein sollte:

SELECT a.dev, b.asha, c.unk 
FROM a 
    FULL OUTER JOIN b ON a.dev = b.devicb 
    FULL OUTER JOIN c ON a.dev = c.devicc 
WHERE 
    a.cust = 'SNTC' AND 
    b.cust = 'SNTC' AND 
    c.cust = 'SNTC' AND 
    a.invent = '10' AND 
    b.invent = '10' AND 
    c.invent = '10' 
+0

Streng genommen Sie nicht ORM-Modelle ohne Primärschlüssel haben können, seien sie real oder nicht. Es scheint, dass Sie den Kern verwenden. –

+0

Ja, ich habe Primärschlüssel in ORM, aber nicht korrekt zugeordnet –

+0

@ IljaEverilä korrigiert die Frage, sorry. Was meinst du? Es scheint, du benutzt den Kern. –

Antwort

0

ich auf diese Weise gelöst, invoquing nur .join im vorherigen beitreten, aber nur mit rechte Tabelle. self._join.join(rightTable,...)

Komplettlösung für das Verfahren:

def get_joins(self, first, leftTable, rightTable, leftTableColumn, rightTableColumn, outer): 
    if first: 
     self._join = join(leftTable, rightTable, leftTableColumn == rightTableColumn, full=outer) 
     first = False 
    else: 
     self._join = self._join.join(rightTable, leftTableColumn == rightTableColumn, full=outer)