Pythonでデータの取り込みや加工・集計、分析処理に利用できるライブラリの一つにPandasがあり、これを利用するとCSVファイルの読み込みに加え、データベースのデータの読み込みも行える。
今回は、Pandasを利用してOracle DBのデータ読み込みを行ってみたので、その手順とサンプルプログラムを共有する。
前提条件
下記記事の、A5M2を利用したOracle DBへの接続が行えること。
Oracle DBへ接続する際の接続設定は以下の通りで、パスワードは「USER01」であること。
また、USER_DATAテーブルに、以下のデータが作成されていること。
さらに、下記記事のAnacondaをインストールしJupyter Notebookを利用できること。
やってみたこと
oracledbパッケージのインストール
PythonでOracle DBに接続するには、Anacondaでoracledbパッケージを使えるようにする必要がある。その手順は、以下の通り。
1) Windowsのスタートメニューから「Anaconda Prompt」を選択する。
2) 以下のように、「conda list -f oracledb」コマンドを実行し、Anacondaにoracledbパッケージが含まれていないことを確認する。
3)「pip install oracledb」コマンドを実行し、oracledbパッケージをインストールする。
4)「conda list -f oracledb」コマンドを再度実行し、Anacondaにoracledbパッケージがインストールされたことを確認する。
oracledbによるSELECT文の実行
oracledbを利用して、Oracle DBのデータを取得し表示するサンプルプログラムと実行結果は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import oracledb # OracleDBへの接続情報 oracle_user = "USER01" oracle_passwd = "USER01" oracle_hostname = "localhost" oracle_sid = "xe" oracle_dsn = oracle_hostname + "/" + oracle_sid # OracleDBを初期化し、接続 oracledb.init_oracle_client() connection = oracledb.connect(user=oracle_user , password=oracle_passwd, dsn=oracle_dsn) # SELECT文を定義 # 複数行にまたがる文字列なので、トリプルクォートで囲う sql_query = """ SELECT ID, NAME FROM USER_DATA ORDER BY ID ASC """ print("*** 実行するSELECT文 ***") print(sql_query) print() # SELECT文を実行し、結果を出力 cursor = connection.cursor() cursor.execute(sql_query) print("*** 実行結果 ***") for id, name in cursor: print("id =" + str(id) + ", name = " + name) # OracleDBから切断 connection.close() |
PandasによるSELECT文の実行
Pandasを利用して、Oracle DBのデータを取得する際、以下のサンプルプログラムを実行すると、実行は行えるものの、SQLAlchemyのみがサポート対象である旨の警告が出てしまう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import oracledb import pandas as pd # OracleDBへの接続情報 oracle_user = "USER01" oracle_passwd = "USER01" oracle_hostname = "localhost" oracle_sid = "xe" oracle_dsn = oracle_hostname + "/" + oracle_sid # OracleDBを初期化し、接続 oracledb.init_oracle_client() connection = oracledb.connect(user=oracle_user , password=oracle_passwd, dsn=oracle_dsn) # SELECT文を定義 # 複数行にまたがる文字列なので、トリプルクォートで囲う sql_query = """ SELECT * FROM USER_DATA ORDER BY ID ASC """ print("*** 実行するSELECT文 ***") print(sql_query) # SELECT文を実行し、datasetに格納 dataset = pd.read_sql(sql_query, con=connection) # OracleDBから切断 connection.close() |
1 2 | # 取得したデータを表示 dataset |
上記ソースコードを、SQLAlchemyを利用するよう修正したサンプルプログラムと実行結果は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import oracledb import pandas as pd from sqlalchemy.engine.url import URL from sqlalchemy.engine.create import create_engine # OracleDBへの接続情報 oracle_user = "USER01" oracle_passwd = "USER01" oracle_hostname = "localhost" oracle_sid = "xe" # OracleDBへの接続URLを生成 oracle_url = URL.create( drivername='oracle+cx_oracle', username=oracle_user, password=oracle_passwd, host=oracle_hostname, database=oracle_sid ) # OracleDBを初期化 oracledb.init_oracle_client() # SQLAlchemyを使ってOracleDBに接続する際のエンジンを定義 engine = create_engine(oracle_url) # SELECT文を定義 # 複数行にまたがる文字列なので、トリプルクォートで囲う sql_query = """ SELECT * FROM USER_DATA ORDER BY ID ASC """ print("*** 実行するSELECT文 ***") print(sql_query) # SELECT文を実行し、dataset2に格納 dataset2 = pd.read_sql(sql_query, con=engine) |
1 2 | # 取得したデータを表示 dataset2 |
なお、上記実行結果になるには、cx-oracleパッケージのインストールする必要がある。cx-oracleパッケージをインストールしていない場合、以下のエラーメッセージが表示される。
cx-oracleパッケージのインストール
SQLAlchemyを利用するには、cx-oracleパッケージのインストールが必要である。その手順は、以下の通り。
1) Anacondaプロンプトで「pip install cx_Oracle」コマンドを実行すると、Microsoft Visual C++ 14.0以降がインストールされていない場合、以下のエラーメッセージが表示される。
2) 以下のサイトの記載内容に従って、Microsoft Visual C++ 14.0以降をインストールする。
「microsoft-visual-c-14-0-or-greater-is-required-」が出た場合の対処方法
3) Anacondaプロンプトで「pip install cx_Oracle」コマンドを再度実行すると、以下のように、cx-oracleパッケージがインストールされる。
4)「conda list -f cx-oracle」コマンドを実行し、Anacondaにcx-oracleパッケージがインストールされたことを確認する。
要点まとめ
- PythonでOracle DBに接続するには、oracledbパッケージをインストールする必要がある。
- Pandasのread_sqlメソッドを利用して、Oracle DBのデータを取得すると、実行は行えるものの、SQLAlchemyのみがサポート対象である旨の警告が出てしまう。
- SQLAlchemyを利用してOracle DBに接続するには、cx-oracleパッケージをインストールする必要がある。