データベース教育例4(プログラム言語からの接続)

これまでオラクルやSQLの概要、PL/SQLまで見てきましたが、今回はオラクル基礎の最後としてプログラム言語からの接続を行います。
具体的には、Pythonとオラクル接続用の拡張モジュールであるcx_oracleを使って接続を行います。

cx_oracleの導入

cx_oracleは、他のプラグインと同じくpipコマンドにて導入します。

D:>pip install cx_oracle
Collecting cx_oracle
Downloading https://files.pythonhosted.org/packages/22/30/cd111234ff05d7d5d1d027642df7270dea14c56fbc8d5cfedf14277ffedf/cx_Oracle-7.3.0-cp38-cp38-win32.whl (135kB)
|████████████████████████████████| 143kB 1.3MB/s
Installing collected packages: cx-oracle
Successfully installed cx-oracle-7.3.0

オラクル接続環境の整備

オラクルの接続環境設定は、以前の記事で書きましたが、概要を示しておきます。
1.媒体のダウンロード
ダウンロード用のURLから下記3つの媒体(zipファイル)をダウンロードします。
 Basic Package、SQL*Plus Package、Tools Package
ダウンロード時には、バージョンには注意してください。最近、クラウド用の18や19といったバージョンが追加されていますが、一般のオンプレ用であれば、バージョンは12cです。
2.媒体の解凍とパス、環境変数の設定
媒体を適当なフォルダーに解凍してPATHを設定し、環境変数ORACLE_HOMEを設定します。
3.tnsnames.oraの設定
下記フォルダーを作成し、tnsnames.oraファイルを作成します。(ファイルの内容は、前述の記事を参考にしてください。)
$ORACLE_HOME\network\admin
4.SQL*Plusによる接続確認
コマンドラインからsqlplusを起動して接続を確認します。接続が成功した画面を以下に示します。

D:>sqlplus hoge/hoge@hogedb
SQL*Plus: Release 12.2.0.1.0 Production on 日 1月 19 14:37:16 2020
Copyright (c) 1982, 2017, Oracle. All rights reserved.
最終正常ログイン時間: 土 1月 18 2020 11:26:19 +09:00
Oracle Database 12c Standard Edition Release 12.2.0.1.0 – 64bit Production
に接続されました。
SQL>

プログラムの作成

準備が完了しましたので、接続用のプログラムを作成しましょう。
以下がサンプルとなります。

import cx_Oracle as co

if __name__ == '__main__':
    # Db接続
    con = co.connect("hoge", "hogepwd", "hogedb")
    # カーソルの取得
    cu = con.cursor()
    # クエリの実行
    cu.execute("select * from emp")
    # フェッチ
    rows = cu.fetchall()
    # レコードの取得と表示
    for row in rows:
        print(row)
    # カーソルのクローズ
    cu.close()

5行目は、ユーザー名とパスワード、tnsnames.oraに設定した接続文字列を指定します。サンプルはsqlplusの引数として、”hoge/hogepwd@hogedb”を指定したイメージとなります。
クエリを実行(9行目)してフェッチすると(11行目)、変数rowsに結果が返却されます。最後にカーソルをクローズ(16行目)します。
結果はタプルの配列で返却されますので、以下のように表示されます。

(7839, ‘KING’, ‘PRESIDENT’, None, datetime.datetime(1981, 11, 17, 0, 0), 5000.0, None, 10)
(7698, ‘BLAKE’, ‘MANAGER’, 7839, datetime.datetime(1981, 5, 1, 0, 0), 2850.0, None, 30)
(7782, ‘CLARK’, ‘MANAGER’, 7839, datetime.datetime(1981, 6, 9, 0, 0), 2450.0, None, 10)
(7566, ‘JONES’, ‘MANAGER’, 7839, datetime.datetime(1981, 4, 2, 0, 0), 2975.0, None, 20)

14行目を以下のように変更すれば、1から3カラム目のデータ(カラムempno、ename、job)だけを表示できます。
print(row[0:3])

考察・まとめ

今回は、プログラムからデータベースへアクセスすることを、Pythonとオラクル、cx_Oracleを使って確認しました。
基本的な内容だったとはいえ、とても簡単に接続できました。
公式ドキュメント(英語)は以下にありますので確認してみてください。