SQLAlchemy-テーブルのリストの取得


94

ドキュメントでこれに関する情報を見つけることができませんでしたが、SQLAlchemyで作成されたテーブルのリストを取得するにはどうすればよいですか?

クラスメソッドを使用してテーブルを作成しました。

回答:


86

すべてのテーブルは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)

7
バージョン0.8以降非推奨:sqlalchemy.schema.MetaData.reflect()メソッドを使用してください。そして、とではengine = sqlalchemy.create_engine('mysql://user:password@host/db_name')なく、を使用"mysql://user:password@host"してくださいengine.execute("use db_name")
Java Xu

@XuJiawan:ここで廃止されるものはわかりませんsqlalchemy.MetaData.reflect()。そうでない場合にどの方法が提案されるのかわかりませんか?
SingleNegationElimination 2014年

@IfLoop:sqlalchemyドキュメントから見つけました。
Java Xu

1
@XuJiawan:リンクは、ブールフラグであるへのreflect 引数MetaData.__init__、私が私の回答で示したとおり正確にを使用するために非推奨になっていることを示唆MetaData.reflect()しています。
SingleNegationElimination 2014年

2
@IfLoop:私の英語が下手で大変申し訳ありません。あなたの答えは正確で、私はそれを引き上げました。バージョン<0.8を使用している場合MetaData.reflect()、この方法でメソッドを使用できない可能性があることを人々に知らせるために、そのコメントを追加しました。また、エンジン宣言が原因で同じ問題が発生する可能性のある他の人にもコメントしてください。
Java Xu

76

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'(スタックは切り捨て)
Darshan Chaudhary 2017

これは、とも働くフラスコSQLAlchemyのがあるので、エンジンへの直接アクセスを経由して例えばDB.engine.table_names()または任意のデータベース変数の名前ですが。
コリディア

40
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())


それが機能しない場合は、エンジンが正しく接続できないことが原因である可能性が高いので(2行目の問題です)、実行するまでエラーメッセージは表示されませんengine.table_names()
grofte

この回答者を使用してください。
Manakin


11

私はこのようなものを探していました:

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

3
これはクロスプラットフォームではありません。mysqlでのみ機能し、他のデータベースエンジンでは機能しません。
Edward Betts 2017年

@EdwardBetts正解です。どんなdbエンジンを考えていましたか?
jmunsch

OPがSQLではなくpostgresを要求
o elhajoui

4

テーブルを作成したメタデータオブジェクトは、辞書にあります。

metadata.tables.keys()

4

私は同じ問題を解決していて、この投稿を見つけました。いくつか実行した後、すべてのテーブルをリストするために以下を使用することをお勧めします:(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を提供します。これはクイッククエリにも役立ちます。


この!なしreflectmetadata.sorted_tablesは動作しません
ケイ


2

これだけです:

engine.table_names()

また、テーブルが存在するかどうかをテストするには:

engine.has_table(table_name)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.