Je n'ai pas trouvé d'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 des classes pour créer les tableaux.
Je n'ai pas trouvé d'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 des classes pour créer les tableaux.
Tous les tableaux sont rassemblés dans le 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 savoir quelles tables sont présentes dans votre base de données, même parmi celles dont vous n'avez pas encore parlé à SQLAlchemy, vous pouvez utiliser la réflexion de table. SQLAlchemy va alors inspecter la base de données et mettre à jour les métadonnées avec toutes les tables manquantes.
>>> metadata.reflect(engine)
Pour Postgres, si vous avez plusieurs schémas, vous devrez parcourir en boucle tous les schémas du moteur :
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)
Je reçois 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'
(pile tronquée)
Cela fonctionne également avec Flask-SQLAlchemy puisqu'il y a accès direct au moteur via, par exemple DB.engine.table_names()
ou quel que soit le nom de la variable de la base de données.
Si cela ne fonctionne pas, c'est probablement parce que le moteur ne peut pas se connecter correctement (donc un problème dans la ligne 2) mais vous n'aurez pas le message d'erreur tant que vous n'aurez pas exécuté engine.table_names()
À partir de SQLAlchemy 1.4 : https://docs.sqlalchemy.org/en/14/core/reflection.html#fine-grained-reflection-with-inspector
from sqlalchemy import create_engine
from sqlalchemy import inspect
engine = create_engine('...')
insp = inspect(engine)
print(insp.get_table_names())
Les méthodes plus anciennes ( engine.table_names()
) rendement :
SADeprecationWarning: The from_engine() method on Inspector is deprecated and will be removed in a future release. Please use the sqlalchemy.inspect() function on an Engine or Connection in order to acquire an Inspector. (deprecated since: 1.4)
metadata.tables.keys()
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.