2016-05-31 13 views
0

Ich habe zwei Tabellen Eintrag und Gruppen in Python definiert Flask SQLAlchemy zu einer PostgresSQL Datenbank verbunden mit:Wie führt man einen natürlichen Join auf zwei Tabellen mit SQLAlchemy und Flask durch?

class Entry (db.Model): 
    __tablename__ = "entry" 
    id = db.Column('id', db.Integer, primary_key = True) 
    group_title = db.Column('group_title', db.Unicode, db.ForeignKey('group.group_title')) 
    url = db.Column('url', db.Unicode) 
    next_entry_id = db.Column('next_entry_id', db.Integer, db.ForeignKey('entry.id')) 

    entry = db.relationship('Entry', foreign_keys=next_entry_id) 
    group = db.relationship('Group', foreign_keys=group_title) 

class Group (db.Model): 
    __tablename__ = "group" 
    group_title = db.Column('group_title', db.Unicode, primary_key = True) 
    group_start_id = db.Column('group_start_id', db.Integer) 
    #etc. 

Ich versuche, die zwei Tabellen mit einem natürlichen zu kombinieren verbinden die Entry.id und Group.group_start_id als gemeinsames Feld.

Ich konnte eine einzige Tabelle für alle Datensätze abfragen. Aber ich möchte Tabellen durch Fremdschlüssel-ID verbinden, um Datensätze zu geben, die sich auf Group.group_start_id und Group.group_title auf einen bestimmten Entry Datensatz beziehen.

Ich habe Probleme mit der Kolben-SQLAlchemy Abfragesyntax oder Prozess

ich verschiedene Ansätze versucht habe (zur Liste einig):

db.session.query(Group, Entry.id).all()

db.session.query(Entry, Group).all()

db.session.query.join(Group).first()

db.session.query(Entry, Group).join(Group)

Alle von ihnen haben eine Liste von Tupeln zurückgegeben, die größer ist als erwartet und enthält nicht, was ich will. Ich suche folgendes Ergebnis: (Entry.id, group_title, Group.group_start_id, Entry.url)

Ich wäre für jede Hilfe dankbar.

Antwort

1

I verwendet, um die folgende Abfrage ein natuaral registriert Gruppe und Eintrag Tabelle auszuführen: db.session.query(Entry, Group).join(Group).filter(Group.group_start_id == Entry.id).order_by(Group.order.asc())

ich habe die .join Funktion in meiner Abfrage dies mit dem mir der Gruppentabelle beitreten durfte t er Eintrittstisch. Dann filtere ich die Ergebnisse der Abfrage, indem ich Group.group_start_id verwende, das ein Fremdschlüssel in der Gruppentabelle ist, der sich auf Entry.id bezieht, der der Primärschlüssel in der Entry-Tabelle ist.

0

Da Sie den Basis-Join bereits mithilfe des Aufrufs relationship() ausgeführt haben. Wir haben die Daten, die Sie auf dem Erhalten wollen konzentrieren können, eine Abfrage wie db.session.query(Entry, Group).all() kehrt Tupel von (Entry, Group) Typ, von dem aus Sie so etwas wie leicht tun können:

test = db.session.query(Entry, Group).one() 
print(test[0].id)    #prints entry.id 
print(test[1].group_start_id) # prints Group.group_start_id 
#... 

SQLAlchemy hat great article, wie Arbeit verbindet

+0

Danke für den Vorschlag! Leider suche ich nicht genau danach. Mit dem Abfragetool in pgAdmin kann ich diese Abfrage verwenden, um die gesuchte Tabelle zu erhalten: 'wähle * aus" group "join" entry "auf" group ".group_start_id =" entry ".id;'. Wie kann ich das mit dem SQLAlchemy-Modellsystem ausführen? Ich bin in der Lage, die rohe Abfrage über 'db.engine.execute' auszuführen, und ich bekomme das Ergebnis, das ich will, aber es ist ein Tupel und kein Dictionary Style-Objekt, wie es bevorzugt würde. –

+0

Funktioniert der Beispielcode, den ich geschrieben habe, nicht? Oder ist da noch etwas falsch? –