これが私のために働いたものです。私の Python と Oracle のバージョンはあなたのものとは少し異なりますが、同じアプローチが適用されるはずです。cx_Oracle バイナリ インストーラーのバージョンが、Oracle クライアントと Python のバージョンと一致していることを確認してください。
私のバージョン:
- パイソン 2.7
- Oracle インスタント クライアント 11G R2
- cx_Oracle 5.0.4 (Unicode、Python 2.7、Oracle 11G)
- Windows XP SP3
手順:
- Oracle インスタント クライアント パッケージをダウンロードします。私は、instantclient-basic-win32-11.2.0.1.0.zip を使用しました。C:\your\path\to\instantclient_11_2 に解凍します。
- cx_Oracle バイナリ インストーラをダウンロードして実行します。cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi を使用しました。すべてのユーザーにインストールし、レジストリで見つかった Python 2.7 の場所を指定しました。
- ORACLE_HOME および PATH 環境変数を、バッチ スクリプトまたはアプリ コンテキストで意味のある任意のメカニズムを介して設定し、それらが Oracle Instant Client ディレクトリを指すようにします。以下の oracle_python.bat ソースを参照してください。これにはもっと洗練された解決策があるはずですが、システム全体の変更をできるだけ制限したかったのです。対象の Oracle Instant Client ディレクトリを PATH の先頭 (または少なくとも他の Oracle クライアント ディレクトリの前) に配置してください。現在、私はコマンド ラインでのみ作業を行っているため、cx_Oracle を必要とするプログラムを実行する前に、シェルで oracle_python.bat を実行するだけです。
- regedit を実行し、\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE に NLS_LANG キーが設定されているかどうかを確認します。その場合は、キーの名前を変更する (私は NLS_LANG_OLD に変更しました) か、設定を解除します。このキーは、Oracle 7 クライアントのデフォルトの NLS_LANG 値としてのみ使用する必要があるため、Oracle 7 クライアントを別の場所で使用していない限り、削除しても安全です。いつものように、変更を行う前に必ずレジストリをバックアップしてください。
- これで、Python プログラムに cx_Oracle をインポートできるはずです。以下の oracle_test.py ソースを参照してください。私のバージョンの cx_Oracle では、接続と SQL 文字列を Unicode に設定する必要があったことに注意してください。
ソース: oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
ソース: oracle_test.py
import cx_Oracle
conn_str = u'user/password@host:port/service'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u'select your_col_1, your_col_2 from your_table')
for row in c:
print row[0], "-", row[1]
conn.close()
考えられる問題:
- 「ORA-12705: NLS データ ファイルにアクセスできないか、指定された環境が無効です」 - NLS_LANG レジストリを変更する前に、この問題に遭遇しました。
- 「TypeError: 引数 1 は、str ではなく Unicode でなければなりません」 - 接続文字列を Unicode に設定する必要がある場合。
- 「TypeError: Expecting None or a string」 - SQL 文字列を Unicode に設定する必要がある場合。
- 「ImportError: DLL の読み込みに失敗しました: 指定されたプロシージャが見つかりませんでした。」- cx_Oracle が適切な Oracle クライアント DLL を見つけられないことを示している可能性があります。