SQLAlchemy - Eine Liste der Tabellen abrufen

93

Ich konnte keine Informationen dazu in der Dokumentation finden, aber wie kann ich eine Liste der in SQLAlchemy erstellten Tabellen erhalten?

Ich habe die Klassenmethode verwendet, um die Tabellen zu erstellen.

Seitenwickler
quelle

Antworten:

86

Alle Tabellen werden im tablesAttribut des SQLAlchemy MetaData-Objekts gesammelt . So erhalten Sie eine Liste der Namen dieser Tabellen:

>>> metadata.tables.keys()
['posts', 'comments', 'users']

Wenn Sie die deklarative Erweiterung verwenden, verwalten Sie die Metadaten wahrscheinlich nicht selbst. Glücklicherweise sind die Metadaten in der Basisklasse noch vorhanden.

>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)

Wenn Sie herausfinden möchten, welche Tabellen in Ihrer Datenbank vorhanden sind, auch unter denen, von denen Sie SQLAlchemy noch nicht einmal erzählt haben, können Sie die Tabellenreflexion verwenden. SQLAlchemy überprüft dann die Datenbank und aktualisiert die Metadaten mit allen fehlenden Tabellen.

>>> metadata.reflect(engine)

Wenn Sie für Postgres mehrere Schemas haben, müssen Sie alle Schemas in der Engine durchlaufen:

from sqlalchemy import inspect
inspector = inspect(engine)
schemas = inspector.get_schema_names()

for schema in schemas:
    print("schema: %s" % schema)
    for table_name in inspector.get_table_names(schema=schema):
        for column in inspector.get_columns(table_name, schema=schema):
            print("Column: %s" % column)
SingleNegationElimination
quelle
7
Veraltet seit Version 0.8: Bitte verwenden Sie die Methode sqlalchemy.schema.MetaData.reflect (). Und beachten Sie, verwenden Sie engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')eher als "mysql://user:password@host"und engine.execute("use db_name").
Java Xu
@XuJiawan: Ich bin nicht sicher, welche Sache hier veraltet ist, ich bin nicht sicher, welche Methode ich vorschlage, wenn es nicht ist sqlalchemy.MetaData.reflect()?
SingleNegationElimination
@IfLoop: Ich habe es aus dem sqlalchemy-Dokument gefunden .
Java Xu
1
@XuJiawan: Der Link deutet darauf hin, dass das reflect Argument für MetaData.__init__ein boolesches Flag zugunsten der Verwendung veraltet ist MetaData.reflect(), genau wie ich es in meiner Antwort gezeigt habe.
SingleNegationElimination
2
@IfLoop: Tut mir sehr leid wegen meinem schlechten Englisch. Ihre Antwort ist genau richtig und ich habe sie verbessert. Ich habe diesen Kommentar hinzugefügt, um die Leute darauf aufmerksam zu machen, dass sie bei Verwendung von Version <0.8 möglicherweise keine MetaData.reflect()Methode auf diese Weise verwenden. Und kommentieren Sie es auch für jemanden, der möglicherweise das gleiche Problem hat, das durch die Motordeklaration verursacht wird.
Java Xu
76

Es gibt eine Methode im engineObjekt, um die Liste der Tabellennamen abzurufen.engine.table_names()

Zubair Alam
quelle
Ich bekomme Traceback (most recent call last): File "dedup_jobs.py", line 31, in <module> print(engine.table_names()) File "/Users/darshanchoudhary/.virtualenvs/services/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2128, in table_names return self.dialect.get_table_names(conn, schema) value = value.replace(self.escape_quote, self.escape_to_quote) AttributeError: 'NoneType' object has no attribute 'replace'(Stapel abgeschnitten)
Darshan Chaudhary
Dies funktioniert auch mit Flask-SQLAlchemy , da ein direkter Zugriff auf die Engine über z. B. DB.engine.table_names()oder wie auch immer der Name der Datenbankvariablen lautet.
Colidyre
40
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
Maeda
quelle
3
Dies ist die richtige Antwort, die ab November 2018 funktioniert.
Austin Mackillop
Wenn es nicht funktioniert, liegt es höchstwahrscheinlich daran, dass die Engine nicht richtig angeschlossen werden kann (also ein Problem in Zeile 2), aber Sie erhalten die Fehlermeldung erst, wenn Sie ausgeführt werdenengine.table_names()
grofte
Verwenden Sie diese Antwort Personen.
Manakin
12

Verwenden Sie im Python-Interpreter db.engine.table_names ()

$ python
>>> from myapp import db
>>> db.engine.table_names()
Mwirabua Tim
quelle
11

Ich habe so etwas gesucht:

from sqlalchemy import create_engine
eng = create_engine('mysql+pymysql://root:password@localhost:3306', pool_recycle=3600)
q = eng.execute('SHOW TABLES')

available_tables = q.fetchall()

Es führt eine Ausführung durch und gibt alle Tabellen zurück.

aktualisieren:

Postgres:

eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
jmunsch
quelle
3
Dies ist nicht plattformübergreifend. Es funktioniert nur mit MySQL, nicht mit anderen Datenbank-Engines.
Edward Betts
@ EdwardBetts Sie haben Recht, über welche DB-Engine haben Sie sich gewundert?
jmunsch
OP bat um Postgres nicht sql
o elhajoui
4

Das Metadatenobjekt, mit dem Sie die Tabellen erstellt haben, befindet sich in einem Wörterbuch.

metadata.tables.keys()
Keith
quelle
4

Ich löse das gleiche Problem und habe diesen Beitrag gefunden. Nach einigen Versuchen würde ich vorschlagen, unten alle Tabellen aufzulisten: (von zerocog erwähnt)

metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
    print(table)

Dies ist nützlich für die direkte Tabellenhandhabung und wird meiner Meinung nach empfohlen.

Verwenden Sie den folgenden Code, um Tabellennamen abzurufen:

for table_name in engine.table_names():
    print(table_name)

"metadata.tables" bietet ein Dict für den Tabellennamen und das Tabellenobjekt. Das wäre auch nützlich für eine schnelle Abfrage.

user2189731
quelle
Dies! ohne die reflect, metadata.sorted_tableswird nicht funktionieren
Kay
2

Durch gleichzeitiges Reflektieren aller Tabellen können Sie auch versteckte Tabellennamen abrufen. Ich habe einige temporäre Tabellen erstellt und sie wurden mit angezeigt

meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
    print table

Referenz http://docs.sqlalchemy.org/en/latest/core/reflection.html

Nullocog
quelle
2

So einfach ist das:

engine.table_names()

Um zu testen, ob eine Tabelle vorhanden ist:

engine.has_table(table_name)
Han Zhang
quelle