回答:
すべてのテーブルはtables
、SQLAlchemy MetaDataオブジェクトの属性に収集されます。それらのテーブルの名前のリストを取得するには:
>>> metadata.tables.keys()
['posts', 'comments', 'users']
宣言的な拡張機能を使用している場合は、メタデータを自分で管理していない可能性があります。幸い、メタデータはベースクラスにまだ存在しています。
>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)
データベースに存在するテーブルを把握しようとしている場合、SQLAlchemyにまだ通知していないテーブルの中でも、テーブルリフレクションを使用できます。次に、SQLAlchemyはデータベースを検査し、欠落しているすべてのテーブルでメタデータを更新します。
>>> metadata.reflect(engine)
Postgresの場合、複数のスキーマがある場合、エンジン内のすべてのスキーマをループする必要があります。
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
引数がMetaData.__init__
、私が私の回答で示したとおり正確にを使用するために非推奨になっていることを示唆MetaData.reflect()
しています。
MetaData.reflect()
、この方法でメソッドを使用できない可能性があることを人々に知らせるために、そのコメントを追加しました。また、エンジン宣言が原因で同じ問題が発生する可能性のある他の人にもコメントしてください。
engine
オブジェクトにテーブル名のリストを取得するメソッドがあります。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'
(スタックは切り捨て)
DB.engine.table_names()
または任意のデータベース変数の名前ですが。
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
Pythonインタープリター内でdb.engine.table_names()を使用します
$ python
>>> from myapp import db
>>> db.engine.table_names()
私はこのようなものを探していました:
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()
実行してすべてのテーブルを返します。
更新:
Postgres:
eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
私は同じ問題を解決していて、この投稿を見つけました。いくつか実行した後、すべてのテーブルをリストするために以下を使用することをお勧めします:(zerocogで言及)
metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
print(table)
これは直接のテーブル処理に役立ち、推奨されると思います。
以下のコードを使用してテーブル名を取得します。
for table_name in engine.table_names():
print(table_name)
「metadata.tables」は、テーブル名とテーブルオブジェクトのDictを提供します。これはクイッククエリにも役立ちます。
reflect
でmetadata.sorted_tables
は動作しません
すべてのテーブルを一度に反映すると、非表示のテーブル名も取得できます。私はいくつかの一時テーブルを作成し、それらは
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
リファレンスhttp://docs.sqlalchemy.org/en/latest/core/reflection.html
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
なく、を使用"mysql://user:password@host"
してくださいengine.execute("use db_name")
。