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.