2017-06-14 3 views
1

Wie kann ich alle an SQLAlchemy-Anweisungen beteiligten Tabellen auflisten? Nehmen wir an, wir haben die folgende AbfrageWie kann ich alle an SQLAlchemy-Anweisungen beteiligten Tabellen auflisten

query = session.query(Address).filter(Address.person == person) 

wie können die Tabellen aufzulisten, die von dieser Abfrage in diesem Fall verwendet wird: Person, Adresse

+0

Ihre Anfrage wird (wahrscheinlich) nicht tatsächlich gehen zu extrahieren Sie die Tabelle zugrunde liegenden Person verwenden, aber nur vergleichen 'address.person_id =: person_id'. Es würde helfen, wenn Sie Ihre Modelle in die Frage aufnehmen würden. –

+0

@Ilja Danke Kumpel – sami

Antwort

1

RMN Antwort ist gut, aber es behandelt nicht alle Fälle, Unterabfragen, löschen Aussagen existieren Aussagen etc

hier ist eine allgemeine Art und Weise alle Tabellen

from sqlalchemy.sql.visitors import ClauseVisitor 
from sqlalchemy import Table 


def extract_tables(sql_stmt): 
    tables = [] 
    visitor = ClauseVisitor() 
    cluase_iter = visitor.iterate(elem) 
    for e in cluase_iter: 
     if isinstance(e, Table): 
      tables.append(e) 
     if isinstance(e, (ValuesBase, UpdateBase)): 
      tables.append(e.table) 
    return set(tables) 
2

Sie alle Tabellen aus locate_all_froms bekommen können, so etwas wie dieses

from sqlalchemy import Table 
from sqlalchemy.sql.selectable import Alias 

tables = set() 
for f in query.statement.locate_all_froms(): 
    if isinstance(f, Table): 
     tables.add(f) 
    elif isinstance(f, Alias): 
     tables.add(f.element) 
+0

Danke Kumpel, wie könnte ich mit Einfügen und Löschen mit Unterabfragen umgehen? – sami

Verwandte Themen