データベース(SQLAlchemyで作成されたテーブルだけでなく)に存在するすべてのテーブル(およびそれらの列名)に関する情報を提供する関数を実装します。ドキュメンテーションを読んでいる間、これはリフレクションを介して行われているように思えますが、何かを機能させることができませんでした。これを行う方法に関する提案や例はありますか?
エンジンから始める:
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'])
または、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
ちょっと私は、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)
最初に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()
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=データベースからデータを抽出しました。