Python の cx_Oracle で Oracle Database のデータを取得するプログラムを作る(後継 python-oracledb の書き方付き)

Oracle

【注意】cx_Oracle は 2022 年に「python-oracledb」という名前に変わりました。Oracle は、cx_Oracle は古いライブラリなので新しい開発には使わないよう案内しています。これから作る場合は、記事の最後の「後継の python-oracledb で書く場合」を参照してください。python-oracledb は、既定の Thin モードなら Oracle Instant Client のインストールが不要です。

cx_Oracle は、Oracle Database への接続、SQL の実行、データの取得や登録など、Oracle Database に対するさまざまな操作ができる Python のライブラリです。
この記事では、Python のインストール、cx_Oracle のインストール、Oracle Instant Client の準備を行い、Python プログラムから Oracle Database に接続してデータを取得した結果をまとめます。

全体の構成

この記事で動作を確かめた環境の全体像です。プログラムを動かす「クライアント」と、データを持っている「DB サーバー」は別のパソコンで、LAN を通じて 1521 番ポートでつながります。

検証した環境の構成図。クライアント(Windows Server 2025)の Python から、cx_Oracle と Oracle Instant Client、または python-oracledb の Thin モードで、DB サーバー(Windows Server 2022)の Oracle Database 19c のプラガブル DB orclpdb に 1521 番ポートで接続する

図のポイントは次の3つです。

  • 方法1(cx_Oracle)は、Oracle と通信するために Oracle Instant Client(通訳役の部品)が必要です。さらに Instant Client が動くには Visual C++ 再頒布可能パッケージが必要です。どちらかが欠けると、後で説明する DPI-1047 のエラーになります。
  • 方法2(python-oracledb)の Thin モードは、自分で直接 Oracle と通信するので、Instant Client も Visual C++ の部品も要りません。
  • 接続先は「IP アドレス/サービス名」で書きます。サービス名は、DB の中のどの「部屋」に入るかを表します(「サンプルソース作成と実行」で詳しく説明します)。

Pythonインストール

Python の公式サイトからインストールファイルをダウンロードしてインストールします。
インストールファイル:python-3.9.13-amd64.exe
今回は、3.9 系の Windows 64bit 版(記事作成時点で 3.9 系のインストーラーが提供されている最後のバージョン)をインストールします。
インストール時に、必ず「Add Python 3.9 to PATH」にチェックを付けてください。

※Python 3.9 は 2025 年 10 月にサポートが終了しています。また、cx_Oracle は Python 3.10 までの版しか提供されていないため、新しい Python ではインストールに失敗することがあります。新しい Python を使う場合は python-oracledb を使ってください。

cx_Oracleをインストール

コマンドプロンプトを開き、次のコマンドで cx_Oracle をインストールします。

pip install cx_Oracle

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

cx_Oracle を使うには、Oracle Instant Client(Oracle のクライアントライブラリ)が必要です。Oracle Instant Client には、Oracle Database と通信するためのファイルやライブラリが入っていて、cx_Oracle はこれを使って Oracle Database に接続します。

Oracle の公式サイトから、次の Oracle Instant Client をダウンロードしてください。
Instant Client for Microsoft Windows (x64)

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

Oracle Instant Client はインストーラーではなく zip ファイルなので、解凍するだけで使えます。解凍すると instantclient_19_19 というフォルダができるので、このフォルダを使います。

できるだけ新しいバージョンを使うことをおすすめします。Oracle Instant Client 19 は、Oracle Database 11.2 以降に接続できます。

なお、Oracle Instant Client は、使っている Oracle Database のバージョンに対応しているものを選んでください。また、Python と Oracle Instant Client は、どちらも 64bit 版(またはどちらも 32bit 版)にそろえる必要があります。

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

次は、cx_Oracle で Oracle Database に接続し、scott スキーマのオブジェクトの一覧を CSV 形式で標準出力に出すサンプルです。instantclient_19_19 フォルダは、このスクリプトと同じフォルダに置いておきます。

コード中の赤い太字は、自分の環境に合わせて書き換える部分です。

import cx_Oracle
import csv
import os
import sys

# 実行中のスクリプトのフォルダを取得
thisDir = os.path.dirname(os.path.abspath(__file__))

# Oracle Instant Client のフォルダ(スクリプトと同じフォルダに解凍した場合)
oracleInstantClientDir = os.path.join(thisDir, "instantclient_19_19")

# Oracle Instant Client のフォルダを指定して、cx_Oracle を初期化
cx_Oracle.init_oracle_client(lib_dir=oracleInstantClientDir)

# Oracle Database に接続(ユーザー名, パスワード, 接続先 "ホスト/サービス名")
# with を使うと、終わったときに接続とカーソルが自動で閉じられる
with cx_Oracle.connect("scott", "tiger", "192.168.1.34/orcl") as connection:
    with connection.cursor() as cursor:
        # user_objects ビュー(ログインしたユーザーが持つオブジェクトの一覧)を取得
        cursor.execute("select * from user_objects")
        results = cursor.fetchall()

        # 結果を CSV 形式で標準出力に出す
        # (Windows で行の間に空行が入らないよう、改行を "\n" にする)
        csv_writer = csv.writer(sys.stdout, lineterminator="\n")

        # 1 行目:列名
        csv_writer.writerow([col[0] for col in cursor.description])

        # 2 行目以降:データ
        csv_writer.writerows(results)

※コード中の "\n" の \(バックスラッシュ)は、日本語のフォントでは ¥ に見えることがあります。同じ文字なので、そのままコピーして使えます。

接続先の "192.168.1.34/orcl" は「ホスト名または IP アドレス/サービス名」です。

Oracle Database 12c 以降のマルチテナント構成(19c ではインストール時の既定)では、scott のような一般のユーザーはプラガブル・データベース(PDB)の中に作られます。この場合は、PDB のサービス名(例:orclpdb)を指定してください。コンテナ・データベースのサービス名(例:orcl)を指定すると、ユーザーが見つからず「ORA-01017: ユーザー名/パスワードが無効です」になります。サービス名は、DB サーバーで lsnrctl status を実行すると確認できます。

図にすると次のようになります。同じ scott で接続しても、サービス名によって入る「部屋」が変わり、scott がいない部屋(ルート)に入ると接続できません。

接続先のサービス名による違い。192.168.1.221/orcl はルートに入り scott がいないので ORA-01017、192.168.1.221/orclpdb はプラガブル DB に入り接続できる

ライブラリエラーの対処

instantclient-basic-windows.x64-12.2.0.1.0.zip の Oracle Instant Client を Windows Server 2019 で使うと、次のようなエラーが出ることがあります。

Traceback (most recent call last):
File "D:\sample\test.py", line 13, in <module>
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

このエラーは、Oracle Instant Client のライブラリを読み込めなかったことを表しています。Windows でよくある原因は、Oracle Instant Client が必要とする Visual C++ 再頒布可能パッケージが入っていないことです。必要な版は Oracle Instant Client のバージョンによって違い、12.2 では Visual Studio 2013 の再頒布可能パッケージが必要です。

対処方法は次のどちらかです。

  • 使っている Oracle Instant Client のバージョンに合った Visual C++ 再頒布可能パッケージをインストールする(必要な版は、Oracle Instant Client のダウンロードページに書かれています)
  • この記事でダウンロードした Oracle Instant Client 19 を使う

Windows Server 2025 で確かめたところ、Visual Studio 2013 の再頒布可能パッケージが入っていない状態では、Oracle Instant Client 12.2 で上と同じ DPI-1047 が出ました。再頒布可能パッケージ(vcredist_x64.exe、12.0.40664)を入れると、エラーは出なくなりました。Oracle Instant Client 19.19 は、Visual C++ 2015-2022 の再頒布可能パッケージが入っている環境で、そのまま動きました。

ほかに、Python と Oracle Instant Client のビット数(64bit / 32bit)が違う場合にも同じエラーになります。詳しくは cx_Oracle の公式ドキュメントを参照してください。
cx_Oracle 8 Installation

後継の python-oracledb で書く場合

python-oracledb は cx_Oracle の後継です。既定の Thin モードでは Oracle Database に直接つなぐので、Oracle Instant Client も Visual C++ 再頒布可能パッケージも要りません(Thin モードで接続できるのは Oracle Database 12.1 以降です)。

pip install oracledb

上のサンプルを python-oracledb で書くと、次のようになります。接続先(dsn)の書き方は cx_Oracle と同じで、マルチテナント構成では PDB のサービス名を指定します。

import csv
import sys

import oracledb

# Thin モード:Oracle Instant Client は不要
with oracledb.connect(user="scott", password="tiger", dsn="192.168.1.34/orcl") as connection:
    with connection.cursor() as cursor:
        cursor.execute("select * from user_objects")

        csv_writer = csv.writer(sys.stdout, lineterminator="\n")
        csv_writer.writerow([col[0] for col in cursor.description])
        csv_writer.writerows(cursor)

Oracle Database 11.2 に接続する場合は、Thick モードを使います。接続の前に oracledb.init_oracle_client(lib_dir=Oracle Instant Client のフォルダ) を呼ぶと、cx_Oracle と同じように Oracle Instant Client を使って接続します。

動作確認した環境

この記事のコードは、冒頭の「全体の構成」の図の環境で動作を確認しています(2026 年 10 月)。

項目内容
クライアントWindows Server 2025 Standard、Python 3.9.13(64bit)
ライブラリcx_Oracle 8.3.0 / python-oracledb 4.0.2
Oracle Instant Client19.19(64bit)。エラーの確認には 12.2 も使用
DB サーバーWindows Server 2022 Standard、Oracle Database 19c(19.3、マルチテナント構成、PDB 名 orclpdb)
結果cx_Oracle(Instant Client 19.19)、python-oracledb の Thin モード・Thick モードのいずれも、user_objects の一覧を CSV で出力できた

Oracle Database 11.2 への接続は確認していません。

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