web-dev-qa-db-fra.com

SQLAlchemy - Obtention d'une liste de tables

Je n'ai trouvé aucune information à ce sujet dans la documentation, mais comment puis-je obtenir une liste des tables créées dans SQLAlchemy?

J'ai utilisé la méthode de classe pour créer les tables.

81
sidewinder

Toutes les tables sont collectées dans l'attribut tables de l'objet SQLAlchemy MetaData. Pour obtenir une liste des noms de ces tables:

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

Si vous utilisez l'extension déclarative, vous ne gérez probablement pas les métadonnées vous-même. Heureusement, les métadonnées sont toujours présentes sur la classe de base,

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

Si vous essayez de comprendre quelles tables sont présentes dans votre base de données, même parmi celles dont vous n'avez même pas encore parlé à SQLAlchemy, vous pouvez utiliser la réflexion de table. SQLAlchemy inspectera ensuite la base de données et mettra à jour les métadonnées avec toutes les tables manquantes.

>>> metadata.reflect(engine)

Il existe une méthode dans l'objet engine pour récupérer le nom de la liste des tables. engine.table_names()

54
Zubair Alam
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
25
Maeda

Je cherchais quelque chose comme ça:

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

Il exécute et renvoie toutes les tables.

mise à jour:

Postgres:

eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
12
jmunsch

L'objet de métadonnées avec lequel vous avez créé les tables l'a dans un dictionnaire.

metadata.tables.keys()
4
Keith

Je résous le même problème et j'ai trouvé ce message. Après quelques essais, je suggère d'utiliser ci-dessous pour répertorier toutes les tables: (mentionné par zerocog)

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

Ceci est utile pour la manipulation directe des tables et je pense que c'est recommandé.

Et utilisez le code ci-dessous pour obtenir les noms des tables:

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

"metadata.tables" fournit un Dict pour le nom de la table et l'objet Table. ce qui serait également utile pour une requête rapide.

3
user2189731

Dans l'interpréteur python, utilisez db.engine.table_names ()

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

La réflexion de toutes les tables à la fois vous permet également de récupérer les noms de table masqués. J'ai créé des tables temporaires et elles sont apparues avec

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

Référence http://docs.sqlalchemy.org/en/latest/core/reflection.html

2
zerocog