web-dev-qa-db-ja.com

PythonからOracleにアクセスするにはどうすればよいですか?

PythonからOracleにアクセスするにはどうすればよいですか? cx_Oracle msiインストーラーをダウンロードしましたが、Pythonはライブラリをインポートできません。

次のエラーが表示されます。

import cx_Oracle

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import cx_Oracle
ImportError: DLL load failed: The specified module could not be found.

どんな助けにも感謝します。

28
user425194

これが私のために働いたものです。私のPythonとOracleのバージョンはご使用のバージョンとわずかに異なりますが、同じアプローチが適用されるはずです。 cx_OracleバイナリインストーラーのバージョンがOracleクライアントおよびPythonバージョンと一致することを確認してください。

私のバージョン:

  • Python 2.7
  • Oracle Instant Client 11G R2
  • cx_Oracle 5.0.4(Unicode、Python 2.7、Oracle 11G)
  • Windows XP SP3

手順:

  1. Oracle Instant Clientパッケージをダウンロードします。 instantclient-basic-win32-11.2.0.1.0.Zipを使用しました。 C:\ your\path\to\instantclient_11_2に解凍します
  2. Cx_Oracleバイナリインストーラーをダウンロードして実行します。 cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msiを使用しました。すべてのユーザーにインストールし、レジストリで見つかったPython 2.7の場所を指定しました。
  3. Oracleインスタントクライアントディレクトリを指すように、バッチスクリプトまたはアプリのコンテキストで意味のあるメカニズムを介してOracle_HOMEおよびPATH環境変数を設定します。以下のOracle_python.batソースを参照してください。これにはもっと洗練された解決策が必要だと確信していますが、システム全体の変更を可能な限り制限したかったのです。対象のOracle Instant ClientディレクトリをPATHの先頭(または少なくとも他のOracleクライアントディレクトリの前)に配置してください。現在、私はコマンドラインのみを実行しているため、cx_Oracleを必要とするプログラムを実行する前に、シェルでOracle_python.batを実行するだけです。
  4. Regeditを実行し、\ HKEY_LOCAL_MACHINE\SOFTWARE\OracleにNLS_LANGキーが設定されているかどうかを確認します。その場合、キーの名前を変更する(NLS_LANG_OLDに変更した)か、設定を解除します。このキーは、Oracle 7クライアントのデフォルトのNLS_LANG値としてのみ使用する必要があるため、他の場所でOracle 7クライアントを使用している場合を除き、削除しても安全です。いつものように、変更を行う前に必ずレジストリをバックアップしてください。
  5. これで、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:なしまたは文字列が必要」-SQL文字列をUnicodeに設定する必要がある場合。
  • 「ImportError:DLL load failed:指定されたプロシージャが見つかりませんでした。」 -cx_Oracleが適切なOracleクライアントDLLを見つけられないことを示す場合があります。
33
Devon Biere

コードは次のようになります。また、辞書を使用してクエリパラメータを使用する方法の例を示します。 Python 3.6:

import cx_Oracle

CONN_INFO = {
    'Host': 'xxx.xx.xxx.x',
    'port': 12345,
    'user': 'SOME_SCHEMA',
    'psw': 'SECRETE',
    'service': 'service.server.com'
}

CONN_STR = '{user}/{psw}@{Host}:{port}/{service}'.format(**CONN_INFO)

QUERY = '''
    SELECT
        *
    FROM
        USER
    WHERE
        NAME = :name
'''


class DB:
    def __init__(self):
        self.conn = cx_Oracle.connect(CONN_STR)

    def query(self, query, params=None):
        cursor = self.conn.cursor()
        result = cursor.execute(query, params).fetchall()
        cursor.close()
        return result


db = DB()
result = db.query(QUERY, {'name': 'happy'})
8
Vlad Bezden

Service NameまたはSIDに基づいて、次のいずれかの方法を使用できます。

SID付き

import cx_Oracle
dsn_tns = cx_Oracle.makedsn('server', 'port', 'sid')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns)
c = conn.cursor()
c.execute('select count(*) from TABLE_NAME')
for row in c:
   print(row)
conn.close()

[〜#〜] or [〜#〜]

サービス名:

import cx_Oracle
dsn_tns = cx_Oracle.makedsn('server', 'port', service_name='service_name')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns)
c = conn.cursor()
c.execute('select count(*) from TABLE_NAME')
for row in c:
   print(row)
conn.close()
4
Sahil Chhabra

Oracleインスタントクライアントに加えて、Oracle ODACコンポーネントをインストールし、それらへのパスをシステムパスに配置する必要がある場合があります。 cx_Oracleは、それらと共にインストールされるoci.dllファイルへのアクセスを必要とするようです。

また、Python、cx_Oracle、インスタントクライアントのバージョンに一致する正しいバージョン(32ビットまたは64ビット)を取得していることを確認してください。

3
Mike

これら2つを確認してください。正常に機能するはずです-

  1. Python、Oracle instantclient、およびcx_Oracleは32ビットです。
  2. 環境変数を設定します。

チャームのようなウィンドウでこの問題を修正します。

2
Venu Murthy

Cx_Oracleに加えて、Oracleクライアントライブラリをインストールし、cx_Oracleがそれを見つけるためにパスを正しく設定する必要があります-「Dependency Walker」でcx_Oracle DLLを開いてみてください( http://www.dependencywalker.com/ )不足しているDLLが何であるかを確認します。

2
TML

Virtualenvを使用している場合、インストーラーを使用してドライバーを取得するのは簡単ではありません。次に、できること:Devonの説明に従ってインストールします。次に、cx_Oracle.pydおよびcx_Oracle-XXX.Egg-infoフォルダーをPython\Lib\site-packagesから仮想envのLib\site-packagesにコピーします。もちろん、ここでも、アーキテクチャとバージョンが重要です。

2
Ward

pandasを使用している場合は、次の方法でアクセスできます。

import pandas as pd
import cx_Oracle
conn= cx_Oracle.connect('username/pwd@Host:port/service_name')
try:
    query = '''
         SELECT * from dual
             '''
    df = pd.read_sql(con = conn, sql = query)
finally:
    conn.close()
df.head()
2
sushmit
import cx_Oracle
   dsn_tns = cx_Oracle.makedsn('Host', 'port', service_name='give service name') 
   conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns) 
   c = conn.cursor()
   c.execute('select count(*) from schema.table_name')
for row in c:
   print row
conn.close()

注意 :

  1. (dsn_tns)で、必要に応じて、「\」などの特殊文字に対応するために、パラメーターの前に「r」を配置します。

  2. (conn)で、必要に応じて、「\」などの特殊文字に対応するために、パラメータの前に「r」を配置します。たとえば、ユーザー名に「\」が含まれる場合、ユーザー名の前に「r」を配置する必要があります。user= r'User Name 'またはpassword = r'password'

  3. クエリを複数の行に分散させる場合は、三重引用符を使用します。

1
Siraj