Non sono riuscito a trovare alcuna informazione su questo nella documentazione, ma come posso ottenere un elenco di tabelle create in SQLAlchemy?
Ho usato il metodo di classe per creare le tabelle.
Non sono riuscito a trovare alcuna informazione su questo nella documentazione, ma come posso ottenere un elenco di tabelle create in SQLAlchemy?
Ho usato il metodo di classe per creare le tabelle.
Risposte:
Tutte le tabelle vengono raccolte tables
nell'attributo dell'oggetto SQLAlchemy MetaData. Per ottenere un elenco dei nomi di queste tabelle:
>>> metadata.tables.keys()
['posts', 'comments', 'users']
Se stai utilizzando l'estensione dichiarativa, probabilmente non stai gestendo i metadati da solo. Fortunatamente, i metadati sono ancora presenti nella classe base,
>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)
Se stai cercando di capire quali tabelle sono presenti nel tuo database, anche tra quelle di cui non hai ancora parlato a SQLAlchemy, allora puoi usare la riflessione della tabella. SQLAlchemy ispezionerà quindi il database e aggiornerà i metadati con tutte le tabelle mancanti.
>>> metadata.reflect(engine)
Per Postgres, se hai più schemi, dovrai eseguire il loop di tutti gli schemi nel motore:
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
argomento a MetaData.__init__
, un flag booleano, è deprecato a favore dell'utilizzo MetaData.reflect()
, esattamente come ho mostrato nella mia risposta.
MetaData.reflect()
metodo in questo modo. E commentalo anche per qualcun altro che potrebbe avere lo stesso problema causato dalla dichiarazione del motore.
C'è un metodo in engine
oggetto per recuperare l'elenco dei nomi delle tabelle.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'
(pila troncata)
DB.engine.table_names()
o qualunque sia il nome della variabile del database.
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
All'interno dell'interprete Python usa db.engine.table_names ()
$ python
>>> from myapp import db
>>> db.engine.table_names()
Stavo cercando qualcosa del genere:
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()
Esegue e restituisce tutte le tabelle.
aggiornare:
Postgres:
eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
Sto risolvendo lo stesso problema e ho trovato questo post. Dopo alcuni tentativi di esecuzione, suggerirei di utilizzare di seguito per elencare tutte le tabelle: (menzionato da zerocog)
metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
print(table)
Questo è utile per la gestione diretta del tavolo e ritengo sia consigliato.
E usa il codice seguente per ottenere i nomi delle tabelle:
for table_name in engine.table_names():
print(table_name)
"metadata.tables" fornisce un Dict per il nome della tabella e l'oggetto della tabella. che sarebbe utile anche per query rapide.
reflect
, metadata.sorted_tables
non funzionerà
Riflettere tutte le tabelle contemporaneamente ti consente di recuperare anche i nomi delle tabelle nascoste. Ho creato alcune tabelle temporanee e si sono presentate con
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
Riferimento http://docs.sqlalchemy.org/en/latest/core/reflection.html
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
invece di"mysql://user:password@host"
eengine.execute("use db_name")
.