目的
SQLAlchemyを介して既存テーブルのカラム名やカラム型などのメタデータを取得する。
環境
動作環境
- Windows 10 Home
- Python 3.8.5 (Anaconda)
- Oracle Database 18c XE
必要なライブラリ
()
内は検証で使用したバージョン。
- sqlalchemy (1.3.18)
- cx_oracle (7.2.3)
使用するテーブル
create table demo_tbl (
i_col integer,
f_col float,
c_col char(1),
d_col date,
PRIMARY KEY (i_col)
)
実装
準備
エンジンインスタンス作成
RDBに接続するためのsqlalchemy.engine.Engine
インスタンスを作成する。host
, port
, pdb-name
, user
, pass
にはそれぞれ使用する接続情報に置き換えること。
import sqlalchemy
import cx_Oracle
dsnStr = cx_Oracle.makedsn('host','port','pdb-name')
connect_str = 'oracle://user:pass@' + dsnStr.replace('SID', 'SERVICE_NAME')
engine = sqlalchemy.create_engine(connect_str, max_identifier_length=128)
検査インスタンス作成
メタデータを取得するためのsqlalchemy.engine.reflection.Inspector
インスタンスを作成する。
inspector = sqlalchemy.inspect(engine)
検査インスタンスを用いてテーブルのメタデータにアクセスすることができる。
以下ではカラム一覧と主キーの取得方法を紹介する。それ以外の情報を取得する方法はAPIドキュメントを参照のこと。
カラム一覧
以下のようにget_columns
メソッドにテーブル名を渡すとカラム情報のリストが返却される。
columns = inspector.get_columns("demo_tbl")
[{'name': 'i_col', 'type': INTEGER(), 'nullable': False, 'default': None, 'autoincrement': 'auto', 'comment': None}, {'name': 'f_col', 'type': FLOAT(), 'nullable': True, 'default': None, 'autoincrement': 'auto', 'comment': None}, {'name': 'c_col', 'type': CHAR(length=1), 'nullable': True, 'default': None, 'autoincrement': 'auto', 'comment': None}, {'name': 'd_col', 'type': DATE(), 'nullable': True, 'default': None, 'autoincrement': 'auto', 'comment': None}]
type
キーで格納されている値はsqlalchemy.types.TypeEngine
をベースとしたSQLAlchemyで定義された一般型のインスタンス、またはDB個別に実装されたサブクラスのインスタンスになっている。詳細はAPIドキュメントを参照のこと。
# i_col(integer)の場合
type_of_col0 = columns[0]["type"]
type(type_of_col0) # -> <class 'sqlalchemy.sql.sqltypes.INTEGER'>
isinstance(type_of_col0, sqlalchemy.types.TypeEngine) # -> True
isinstance(type_of_col0, sqlalchemy.types.Integer) # -> True
isinstance(type_of_col0, sqlalchemy.types.Float) # -> False
# d_col(date)の場合
type_of_col3 = columns[3]["type"]
type(type_of_col3) # -> <class 'sqlalchemy.dialects.oracle.base.DATE'>
isinstance(type_of_col3, sqlalchemy.types.TypeEngine) # -> True
isinstance(type_of_col3, sqlalchemy.types.DateTime) # -> True
isinstance(type_of_col3, sqlalchemy.types.Date) # -> False
※Oracleのdate
型は時刻まで格納可能なのでSQLAlchemyのクラスとしてはDateTime
となる。
主キー
以下のようにget_pk_constraint
メソッドにテーブル名を渡すと主キー関連の情報がが返却される。
{'constrained_columns': ['i_col'], 'name': 'sys_c007315'}
※get_primary_keys
というメソッドもあるがこれは廃止予定としてdeprecatedになっている。