Python cx_Oracleライブラリを使いOracle Databaseから情報を取得プログラムを作成してみた

Oracle

cx_Oracleはオラクルデータベースへの接続やクエリの実行、データの取得や挿入など、オラクルデータベースに対するあらゆる操作が可能Pythonライブラリです。
ここではPythonをインストール、cx_Oracleインストール、Oracle Client Instanceインストール、Pythonプログラム内でcx_Oracleをインポート、Oracleデータベースへの接続やデータの取得などを試した結果を纏めます。

Pythonインストール

Pythonの公式サイトから最新ファイルをダウンロードしインストールします。
インストールファイル:python-3.9.13-amd64.exe
今回は3.9バージョンのWindows 64bit版最新をインストールします。
インストール時に必ず「Add Python 3.9 to Path」のチェック欄にチェックを付けてインストールしてください。

cx_Oracleをインストール

管理者モードでコマンドプロンプトを開き、次のようにcx_Oracleライブラリをインストールします。

pip install cx_oracle

Oracle Instant Clientダウンロード&インストール

cx_Oracleを使用するためには、Oracle Instant Client(Oracleクライアントライブラリ)が必要です。Oracle Instant Clientは、Oracleデータベースとの通信を可能にするための必要なファイルやライブラリが含まれています。このライブラリを使用してOracleデータベースとの接続を確立し、データベースとのやり取りを行います。

Oracleの公式ウェブサイトから以下のOracle Instant Clientをダウンロードし、インストールしてください。

Instant Client for Microsoft Windows (x64) 64-bit
Instant Client downloads for Microsoft Windows (x64) 64-bit

ダウンロードファイル:instantclient-basic-windows.x64-19.19.0.0.0dbru.zip

インストールより圧縮ファイルを解凍することが正しい説明です。解凍するとinstantclient_19_19をフォルダが確認できます。このフォルダを利用します。

出来れば最新バージョン推奨しています. Oracle Instant Client 19는 Oracle Database 11.2以上に接続できます。

なお、Oracle Instant Clientのバージョンについては、使用しているOracleデータベースのバージョンと互換性があることを確認してください。適切なバージョンのOracle Instant Clientを選択し、インストールすることが重要です。

サンプルソース作成と実行

以下はPythonライブラリcx_Oracleを用いてオラクルデータベースに接続しscottスキマのオブジェクト情報をCSV形式で標準出力するサンプルです。

import cx_Oracle
import csv
import os
import sys

#実行中のスクリプトのディレクトリパスを取得
thisDir = os.path.dirname(os.path.abspath(__file__))

#Oracle Instant Clientのディレクトリパスを指定
oracleInstantClientDir = thisDir + "\\instantclient_19_19"

#Oracle Instant Clientのディレクトリを指定して、cx_Oracleライブラリを初期化
cx_Oracle.init_oracle_client(lib_dir=oracleInstantClientDir )

#Oracleデータベースに接続
connection = cx_Oracle.connect("scott","tiger","192.168.1.34/orcl")

#データベース接続からカーソル(Cursor)を作成
cursor = connection.cursor()

#user_objects テーブルからすべての列を取得するSQLクエリを実行
cursor.execute("select * from user_objects")

# fetchall()を使って結果を取得
results = cursor.fetchall()

# 結果をCSV形式で標準出力に出力
csv_writer = csv.writer(sys.stdout)

# カラム名を取得
header = [col[0] for col in cursor.description]
# ヘッダーをCSVに書き込む
csv_writer.writerow(header)

# 結果をCSV形式で標準出力に出力
if results:
    # データ行をCSVに書き込む
    csv_writer.writerows(results)  

ライブラリエラー対象

instantclient-basic-windows.x64-12.2.0.1.0.zipのオラクルクライアントライブラリをWindows Server 2019で使おうとすると次のようなエラーが発生する場合があります。上記でタウンロードしたOracle Instant Client 19を使うとエラーが無くなります。

Traceback (most recent call last):
File "D:\sample\test.py", line 13, in
cx_Oracle.init_oracle_client(lib_dir=oracleInstantClientDir )
cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified module could not be found". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help

オラクルクライアントライブラリとWindowsにインストールされているVS C++再配布ライブラリとの交換性が合わないのでエラーになっているのではと推測しています。詳細は以下をご参照ください。

cx_Oracle 8 Installation — cx_Oracle 8.3.0 documentation

コメント

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