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.
どんな助けにも感謝します。
これが私のために働いたものです。私のPythonとOracleのバージョンはご使用のバージョンとわずかに異なりますが、同じアプローチが適用されるはずです。 cx_OracleバイナリインストーラーのバージョンがOracleクライアントおよびPythonバージョンと一致することを確認してください。
私のバージョン:
手順:
ソース: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()
考えられる問題:
コードは次のようになります。また、辞書を使用してクエリパラメータを使用する方法の例を示します。 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'})
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()
Oracleインスタントクライアントに加えて、Oracle ODACコンポーネントをインストールし、それらへのパスをシステムパスに配置する必要がある場合があります。 cx_Oracleは、それらと共にインストールされるoci.dllファイルへのアクセスを必要とするようです。
また、Python、cx_Oracle、インスタントクライアントのバージョンに一致する正しいバージョン(32ビットまたは64ビット)を取得していることを確認してください。
これら2つを確認してください。正常に機能するはずです-
チャームのようなウィンドウでこの問題を修正します。
Cx_Oracleに加えて、Oracleクライアントライブラリをインストールし、cx_Oracleがそれを見つけるためにパスを正しく設定する必要があります-「Dependency Walker」でcx_Oracle DLLを開いてみてください( http://www.dependencywalker.com/ )不足しているDLLが何であるかを確認します。
Virtualenvを使用している場合、インストーラーを使用してドライバーを取得するのは簡単ではありません。次に、できること:Devonの説明に従ってインストールします。次に、cx_Oracle.pydおよびcx_Oracle-XXX.Egg-infoフォルダーをPython\Lib\site-packagesから仮想envのLib\site-packagesにコピーします。もちろん、ここでも、アーキテクチャとバージョンが重要です。
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()
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()
注意 :
(dsn_tns)で、必要に応じて、「\」などの特殊文字に対応するために、パラメーターの前に「r」を配置します。
(conn)で、必要に応じて、「\」などの特殊文字に対応するために、パラメータの前に「r」を配置します。たとえば、ユーザー名に「\」が含まれる場合、ユーザー名の前に「r」を配置する必要があります。user= r'User Name 'またはpassword = r'password'
クエリを複数の行に分散させる場合は、三重引用符を使用します。