web-dev-qa-db-ja.com

SQLAlchemyを使用してデータベーステーブルを一覧表示する

データベース(SQLAlchemyで作成されたテーブルだけでなく)に存在するすべてのテーブル(およびそれらの列名)に関する情報を提供する関数を実装します。ドキュメンテーションを読んでいる間、これはリフレクションを介して行われているように思えますが、何かを機能させることができませんでした。これを行う方法に関する提案や例はありますか?

40
drgxfs

エンジンから始める:

from sqlalchemy import create_engine
engine = create_engine("postgresql://u:p@Host/database")

すべてのテーブル/列名へのクイックパス、インスペクターを使用します。

from sqlalchemy import inspect
inspector = inspect(engine)

for table_name in inspector.get_table_names():
   for column in inspector.get_columns(table_name):
       print("Column: %s" % column['name'])

docs: http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html?highlight=inspector#fine-grained-reflection-with-inspector

または、MetaData/Tablesを使用します。

from sqlalchemy import MetaData
m = MetaData()
m.reflect(engine)
for table in m.tables.values():
    print(table.name)
    for column in table.c:
        print(column.name)

docs: http://docs.sqlalchemy.org/en/rel_0_9/core/reflection.html#reflecting-all-tables-at-once

74
zzzeek

ちょっと私は、SQLAlchemyで接続するデータベース内のすべてのテーブルを簡単に反映できる小さなモジュールを作成しました。それを見てみましょう: EZAlchemy

from EZAlchemy.ezalchemy import EZAlchemy

DB = EZAlchemy(
    db_user='username',
    db_password='pezzword',
    db_hostname='127.0.0.1',
    db_database='mydatabase',
    d_n_d='mysql'   # stands for dialect+driver
)

# this function loads all tables in the database to the class instance DB
DB.connect()

# List all associations to DB, you will see all the tables in that database
dir(DB)
3
PepperoniPizza

最初にsqlalchemyエンジンをセットアップします。

from sqlalchemy import create_engine, inspect, text
from sqlalchemy.engine import url

connect_url = url.URL(
    'Oracle',
    username='db_username',
    password='db_password',
    Host='db_Host',
    port='db_port',
    query=dict(service_name='db_service_name'))

engine = create_engine(connect_url)

try:
    engine.connect()
except Exception as error:
    print(error)
    return

他の人が述べたように、inspectメソッドを使用してテーブル名を取得できます。

しかし、私の場合、inspectメソッドによって返されるテーブルのリストは不完全でした。

そこで、sqlalchemyで純粋なSQLクエリを使用してテーブル名を見つける別の方法を見つけました。

query = text("SELECT table_name FROM all_tables where owner = '%s'"%str('db_username'))

table_name_data = self.session.execute(query).fetchall()

答えを完全にするために、inspectメソッドでテーブル名を取得するコードを以下に示します(それが適切に機能する場合)。

inspector = inspect(engine)
table_names = inspector.get_table_names()
0
Rohit

reflection/inspection は便利ですが、データベースからデータを取り出すのに問題がありました。 sqlsoup の方がはるかに使いやすいことがわかりました。 sqlalchemyを使用してエンジンを作成し、そのエンジンをsqlsoup.SQlSoupに渡します。すなわち:

import sqlsoup

def create_engine():
    from sqlalchemy import create_engine
    return create_engine(f"mysql+mysqlconnector://{database_username}:{database_pw}@{database_Host}/{database_name}")

def test_sqlsoup():
    engine = create_engine()
    db = sqlsoup.SQLSoup(engine)
    # Note: database must have a table called 'users' for this example
    users = db.users.all()
    print(users)

if __== "__main__":
    test_sqlsoup()

Sqlalchemyに精通している場合は、sqlsoupに精通しています。これを使用して、wordpress=データベースからデータを抽出しました。

0
user2682863