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.
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.
Antworten:
Alle Tabellen werden im tables
Attribut 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)
sqlalchemy.MetaData.reflect()
?
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.
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.
Es gibt eine Methode im engine
Objekt, um die Liste der Tabellennamen abzurufen.engine.table_names()
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)
DB.engine.table_names()
oder wie auch immer der Name der Datenbankvariablen lautet.
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
Verwenden Sie im Python-Interpreter db.engine.table_names ()
$ python
>>> from myapp import db
>>> db.engine.table_names()
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')
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.
reflect
, metadata.sorted_tables
wird nicht funktionieren
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
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
eher als"mysql://user:password@host"
undengine.execute("use db_name")
.