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.
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.
Réponses:
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)
sqlalchemy.MetaData.reflect()
?
reflect
argument to MetaData.__init__
, un drapeau booléen, est déconseillé au profit de l'utilisation MetaData.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()
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.
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
Dans l'interpréteur python, utilisez db.engine.table_names ()
$ python
>>> from myapp import db
>>> db.engine.table_names()
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.
mettre à jour:
Postgres:
eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
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)
metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
print(table)
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:
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.
reflect
, metadata.sorted_tables
ne fonctionnera pas
Reflecting 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
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
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
plutôt que"mysql://user:password@host"
etengine.execute("use db_name")
.