9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLAlchemyを利用して既存テーブルのメタデータを取得する

Posted at

目的

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になっている。

参考

SQLAlchemy 1.3 Documentation

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?