自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

[Mac] Pythonからcx_OracleでOracleデータベースを操作してみる

Python
Python
ヒノマルク
ヒノマルク

どうもヒノマルクです。今日から吹き出しアイコンを使ってみました。この画像で作ると中々シュールです (笑) 今日はPythonからOracleデータベースにアクセスしてみようと思います。よろしくお願いします。


> 2022/11/30追記

cx_Oracleは名称が変わりpython-oracledbというライブラリになったようです。これから使い始める方はpython-oracledbをインストールした方が良さそうです。

> 2022/12/11追記

python-oracledbの記事を書きました。

pythonからOracleを操作する「cx_Oracle」が「python-oracledb」になったのでさっそく使ってみた
今までPythonからOracleデータベースにアクセスするライブラリとして、「cx_Oracle」を利用していました。しかし、cx_Oracleは「python-oracledb」という名称になったようです。cx_Oracle has a...

スポンサーリンク

cx_Oracleのインストール

基本的にはOSごとのインストール手順が公式ページ*1に載っているので手順に沿って実行します。

今回はMacOSの手順になります。

cx_Oracleのインストール (Macの場合)
$ export ARCHFLAGS="-arch x86_64"
$ /Users/hinomaruc/Desktop/notebooks/my-venv/bin/python3 -m pip install cx_Oracle --upgrade
Out[0]
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)を追加することも多いです。

MacのOracle Instant Clientバージョンは22年1月19日現在19.8.0.0.0が最新版のようです。

ヒノマルクが以前構築したOracleデータベースのバージョンは21.3ですが、使用に問題はありません。

オラクルのサーバーとクライアントの各バージョンのサポート対応表*2はオラクル社にて提供されていますので、ご興味ある方は確認ください。

スポンサーリンク

cx_Oracleを使ってみる

ここまででやっとMacでcx_Oracleを使用する準備が整いました。

Oracle Instant Clientはcx_Oracleのライブラリを読み込んだ後にインストール場所をコードで指定して利用するようです。解凍もしくはインストールした場所を覚えておきましょう。

※ LinuxだとLD_LIBRARY_PATHやORACLE_HOMEの環境変数でOracle Instant Clientの場所を指定すれば、コード上で明示的に指定しなくても動作します。

cx_Oracleのインポート
import cx_Oracle
cx_Oracle.init_oracle_client(lib_dir="/Users/hinomaruc/Desktop/notebooks/instantclient_19_8")
cx_Oracleのバージョン確認
cx_Oracle.version
Out[0]
'8.3.0'
oracle instant clientのバージョン確認
cx_Oracle.clientversion()
Out[0]
(19, 8, 0, 0, 0)
oracleのコネクションの作成
conn = cx_Oracle.connect(user="SYSTEM", password='hinomaruc', dsn="localhost:1521/XE", encoding="UTF-8")
カーソルの作成
cur = conn.cursor()

1件取得を試す

SELECT文の発行
cur.execute("""SELECT TABLE_NAME FROM USER_TABLES""")
Out[0]
<cx_Oracle.Cursor on <cx_Oracle.Connection to SYSTEM@localhost:1521/XE>>
データのフェッチ(取得)
# 1行だけフェッチする
cur.fetchone()
Out[0]
('LOGMNRGGC_GTLO',)

全件取得を試す

データのフェッチ(取得)
cur.execute("""SELECT TABLE_NAME FROM USER_TABLES""")
Out[0]
<cx_Oracle.Cursor on <cx_Oracle.Connection to SYSTEM@localhost:1521/XE>>
データのフェッチ(取得)
# 全行フェッチする
rows = cur.fetchall()
for r in rows:
    print(r)
Out[0]
('LOGMNRGGC_GTLO',)
('LOGMNRGGC_GTCS',)
('LOGMNR_PARAMETER$',)
('LOGMNR_SESSION$',)
・・・省略・・・
('LOGMNRP_CTAS_PART_MAP',)
('LOGMNR_SHARD_TS',)
('LOGSTDBY$APPLY_PROGRESS',)
カーソルとコネクションを閉じる
cur.close()
conn.close()
スポンサーリンク

参照元

*1 https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html#installing-cx-oracle-on-macos-intel-x86

*2 https://support.oracle.com/knowledge/Oracle%20Database%20Products/207303_1.html

タイトルとURLをコピーしました