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.
la source
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.
Toutes les tables sont collectées dans l' tables
attribut 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 vous-même les métadonnées. 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 déterminer 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)
Pour Postgres, si vous avez plusieurs schémas, vous devrez parcourir 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)
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
plutôt que"mysql://user:password@host"
etengine.execute("use db_name")
.sqlalchemy.MetaData.reflect()
?reflect
argument toMetaData.__init__
, un drapeau booléen, est déconseillé au profit de l'utilisationMetaData.reflect()
, exactement comme je l'ai montré dans ma réponse.MetaData.reflect()
méthode de cette manière. Et commentez-le également pour quelqu'un d'autre qui pourrait avoir le même problème causé par la déclaration du moteur.Il existe une méthode dans l'
engine
objet pour récupérer le nom de la liste des tables.engine.table_names()
la source
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)DB.engine.table_names()
ou quel que soit le nom de la variable de base de données.la source
engine.table_names()
Dans l'interpréteur python, utilisez db.engine.table_names ()
la source
Je cherchais quelque chose comme ça:
Il exécute et renvoie toutes les tables.
mettre à jour:
Postgres:
la source
L'objet de métadonnées avec lequel vous avez créé les tables a cela dans un dictionnaire.
la source
Je résous le même problème et j'ai trouvé ce post. Après quelques essais, je suggérerais d'utiliser ci-dessous pour lister toutes les tables: (mentionné par zerocog)
Ceci est utile pour la gestion directe des tables et je pense que c'est recommandé.
Et utilisez le code ci-dessous pour obtenir les noms de table:
"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.
la source
reflect
,metadata.sorted_tables
ne fonctionnera pasReflecting All Tables at Once vous permet également de récupérer les noms de table masqués. J'ai créé des tables temporaires et elles sont apparues avec
Référence http://docs.sqlalchemy.org/en/latest/core/reflection.html
la source
Juste ce simple:
Aussi, pour tester si une table existe:
la source