SQLAlchemy: ottenere un elenco di tabelle


94

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:


86

Tutte le tabelle vengono raccolte tablesnell'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)

7
Deprecato dalla versione 0.8: utilizzare il metodo sqlalchemy.schema.MetaData.reflect (). E nota, usa engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')invece di "mysql://user:password@host"e engine.execute("use db_name").
Java Xu

@XuJiawan: non sono sicuro di quale cosa sia deprecata qui, non sono sicuro di quale metodo sto suggerendo se non lo è sqlalchemy.MetaData.reflect()?
SingleNegationElimination

@IfLoop: l'ho trovato dal documento sqlalchemy .
Java Xu

1
@XuJiawan: il collegamento suggerisce che l' reflect argomento a MetaData.__init__, un flag booleano, è deprecato a favore dell'utilizzo MetaData.reflect(), esattamente come ho mostrato nella mia risposta.
SingleNegationElimination

2
@IfLoop: Mi dispiace molto per il mio inglese scadente. La tua risposta è esattamente giusta e l'ho aumentata. Ho aggiunto quel commento solo per far notare alle persone che se usano la versione <0.8, potrebbero non usare il MetaData.reflect()metodo in questo modo. E commentalo anche per qualcun altro che potrebbe avere lo stesso problema causato dalla dichiarazione del motore.
Java Xu

77

C'è un metodo in engineoggetto per recuperare l'elenco dei nomi delle tabelle.engine.table_names()


ottengo 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)
Darshan Chaudhary

Funziona anche con Flask-SQLAlchemy , poiché esiste un accesso diretto al motore tramite, ad esempio, DB.engine.table_names()o qualunque sia il nome della variabile del database.
colidyre

41
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())

3
Questa è la risposta corretta che funziona da novembre 2018.
Austin Mackillop

Se non funziona, è molto probabile che il motore non possa connettersi correttamente (quindi un problema nella riga 2) ma non riceverai il messaggio di errore finché non eseguiengine.table_names()
grofte

Usa questa risposta persone.
Manakin

12

All'interno dell'interprete Python usa db.engine.table_names ()

$ python
>>> from myapp import db
>>> db.engine.table_names()

11

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')

3
Questa non è multipiattaforma. Funzionerà solo con mysql, non funzionerà con altri motori di database.
Edward Betts

@EdwardBetts hai ragione, di quale motore db ti stavi chiedendo?
jmunsch

OP ha chiesto postgres non sql
o elhajoui il

4

L'oggetto metadati con cui hai creato le tabelle lo ha in un dizionario.

metadata.tables.keys()

4

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.


Questo! senza reflect, metadata.sorted_tablesnon funzionerà
Kay

2

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


2

Solo questo semplice:

engine.table_names()

Inoltre, per verificare se esiste una tabella:

engine.has_table(table_name)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.