どうもヒノマルクです。今日から吹き出しアイコンを使ってみました。この画像で作ると中々シュールです (笑) 今日はPythonからOracleデータベースにアクセスしてみようと思います。よろしくお願いします。
> 2022/11/30追記
> 2022/12/11追記
python-oracledbの記事を書きました。
cx_Oracleのインストール
基本的にはOSごとのインストール手順が公式ページ*1に載っているので手順に沿って実行します。
今回はMacOSの手順になります。
$ export ARCHFLAGS="-arch x86_64"
$ /Users/hinomaruc/Desktop/notebooks/my-venv/bin/python3 -m pip install cx_Oracle --upgrade
Collecting cx_Oracle Downloading cx_Oracle-8.3.0.tar.gz (363 kB) |████████████████████████████████| 363 kB 3.7 MB/s Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Building wheels for collected packages: cx-Oracle Building wheel for cx-Oracle (pyproject.toml) ... done Created wheel for cx-Oracle: filename=cx_Oracle-8.3.0-cp39-cp39-macosx_10_13_x86_64.whl size=189125 sha256=0a6403aa2fe57acb5ef45cbc07fbb228135f4f8777d554740e8c63f321a42c50 Stored in directory: /Users/hinomaruc/Library/Caches/pip/wheels/c4/a8/38/5910c0425c80979bade466c4a0e498c8ccb7dea7cfd172494f Successfully built cx-Oracle Installing collected packages: cx-Oracle Successfully installed cx-Oracle-8.3.0
成功しました。
Oracle Instant Clientのインストール
Oracleデータベースにアクセスするためのツールです。
Mac用はこちらからダウンロードできます。
Oracle Instant Clientダウンロードページ
ヒノマルクはとりあえずは軽量版でいいかなと思い、 Basic Light Package (ZIP)をダウンロードしました。
DMG版でもZIP版でもどちらでも問題ないです。
実業務ではSQL*PLUSも使うので、SQL*Plus Package (ZIP)を追加することも多いです。
ヒノマルクが以前構築したOracleデータベースのバージョンは21.3ですが、使用に問題はありません。
オラクルのサーバーとクライアントの各バージョンのサポート対応表*2はオラクル社にて提供されていますので、ご興味ある方は確認ください。
cx_Oracleを使ってみる
ここまででやっとMacでcx_Oracleを使用する準備が整いました。
Oracle Instant Clientはcx_Oracleのライブラリを読み込んだ後にインストール場所をコードで指定して利用するようです。解凍もしくはインストールした場所を覚えておきましょう。
※ LinuxだとLD_LIBRARY_PATHやORACLE_HOMEの環境変数でOracle Instant Clientの場所を指定すれば、コード上で明示的に指定しなくても動作します。
import cx_Oracle
cx_Oracle.init_oracle_client(lib_dir="/Users/hinomaruc/Desktop/notebooks/instantclient_19_8")
cx_Oracle.version
'8.3.0'
cx_Oracle.clientversion()
(19, 8, 0, 0, 0)
conn = cx_Oracle.connect(user="SYSTEM", password='hinomaruc', dsn="localhost:1521/XE", encoding="UTF-8")
cur = conn.cursor()
1件取得を試す
cur.execute("""SELECT TABLE_NAME FROM USER_TABLES""")
<cx_Oracle
.Cursor on<cx_Oracle
.Connection to SYSTEM@localhost
:1521/XE
>>
# 1行だけフェッチする
cur.fetchone()
('LOGMNRGGC_GTLO',)
全件取得を試す
cur.execute("""SELECT TABLE_NAME FROM USER_TABLES""")
<cx_Oracle
.Cursor on<cx_Oracle
.Connection to SYSTEM@localhost
:1521/XE
>>
# 全行フェッチする
rows = cur.fetchall()
for r in rows:
print(r)
('LOGMNRGGC_GTLO',) ('LOGMNRGGC_GTCS',) ('LOGMNR_PARAMETER$',) ('LOGMNR_SESSION$',) ・・・省略・・・ ('LOGMNRP_CTAS_PART_MAP',) ('LOGMNR_SHARD_TS',) ('LOGSTDBY$APPLY_PROGRESS',)
cur.close()
conn.close()
参照元
*2 https://support.oracle.com/knowledge/Oracle%20Database%20Products/207303_1.html