source

Python에서 Oracle에 액세스하려면 어떻게 해야 합니까?

ittop 2023. 3. 13. 20:51
반응형

Python에서 Oracle에 액세스하려면 어떻게 해야 합니까?

Python에서 Oracle에 액세스하려면 어떻게 해야 합니까?cx_Oracle msi instra를 다운로드했지만 Python이 라이브러리를 Import할 수 없습니다.

다음의 에러가 표시됩니다.

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 버전과 일치하는지 확인하십시오.

내 버전:

  • 파이썬 2.7
  • Oracle Instant Client 11G R2
  • cx_Oracle 5.0.4(유니코드, Python 2.7, Oracle 11G)
  • Windows XP SP3

순서:

  1. 오라클 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.199.모든 사용자를 위해 설치하고 레지스트리에 있는 Python 2.7 위치를 가리켰습니다.
  3. 배치 스크립트 또는 애플리케이션 컨텍스트에서 적절한 메커니즘을 통해 Oracle_HOME 및 PATH 환경 변수를 설정하여 Oracle Instant Client 디렉토리를 가리킵니다.아래 oracle_python.bat 소스를 참조하십시오.이를 위한 보다 우아한 솔루션이 있을 것이라고 확신하지만, 저는 시스템 전체의 변경을 가능한 한 제한하고 싶었습니다.대상 오라클 Instant Client 디렉터리를 PATH의 시작 부분(또는 다른 오라클 클라이언트 디렉터리보다 우선)에 배치해야 합니다.지금은 명령줄 작업만 하고 있기 때문에 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.화이

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 레지스트리를 변경하기 전에 이 문제를 발견했습니다.
  • 연결 문자열을 Unicode로 설정해야 하는 경우 "TypeError: 인수 1은 str이 아닌 Unicode여야 합니다."
  • "TypeError: expecting None or string" - SQL 문자열을 Unicode로 설정해야 하는 경우.
  • "ImportError: DLL 로드 실패:지정된 절차를 찾을 수 없습니다." - cx_Oracle이 적절한 Oracle 클라이언트 DLL을 찾을 수 없음을 나타낼 수 있습니다.

하다를 중 할 수 .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()

또는

서비스 이름 포함:

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()

내 코드는 다음과 같습니다.또한 사전을 사용하여 쿼리 매개 변수를 사용하는 방법에 대한 예도 보여 줍니다.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'})
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. 쿼리를 여러 줄에 분산하려면 세 개의 따옴표를 사용합니다.

팬더를 사용하고 있는 경우는, 다음의 방법으로 액세스 할 수 있습니다.

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()

Oracle Instant Client와 더불어 Oracle ODAC 컴포넌트를 설치하고 시스템 경로에 경로를 추가해야 할 수도 있습니다.cx_Oracle은 이 컴포넌트와 함께 설치된 oci.dll 파일에 액세스해야 할 것 같습니다.

또한 python, cx_Oracle 및 인스턴트 클라이언트 버전과 일치하는 올바른 버전(32비트 또는 64비트)이 있는지 확인하십시오.

cx_Oracle과 더불어 cx_Oracle이 Oracle 클라이언트 라이브러리를 검색하려면 Oracle 클라이언트 라이브러리를 설치하고 경로를 올바르게 설정해야 합니다. "Dependency Walker"(http://www.dependencywalker.com/)에서 cx_Oracle DLL을 열고 누락된 DLL을 확인하십시오.

다음의 2개가 동작하고 있는 것을 확인합니다.

  1. Python, Oracle Instantclient 및 cx_Oracle은 32비트입니다.
  2. 환경변수를 설정합니다.

창문에 있는 이 문제를 마법처럼 해결합니다.

virtualenv를 사용하는 경우 설치 관리자를 사용하여 드라이버를 가져오는 것은 그리 간단한 일이 아닙니다.다음에 할 수 있는 작업: Devon의 설명에 따라 설치합니다.그런 다음 cx_Oracle에 복사합니다.pyd 및 python\Lib\site-packages의 cx_Oracle-XX.egg-info 폴더를 가상 환경에서 Lib\site-packages로 만듭니다.물론 여기서도 아키텍처와 버전이 중요합니다.

import cx_Oracle 
from sshtunnel import SSHTunnelForwarder

# remote server variables
remote_ip_address = "<PUBLIC_IP_ADDRESS_OF_DB_SERVER>"
remote_os_username = "<OS_USERNAME>"
ssh_private_key = "<PATH_TO_PRIVATE_KEY>"

# Oracle database variables
database_username = "<DATABASE_USER>"
database_password = "<DATABASE_USER_PASSWORD>"
database_server_sid = "<ORACLE_SID>"

def server_connection():

    server = SSHTunnelForwarder(
             remote_ip_address,
             ssh_username=remote_os_username,
             ssh_password=ssh_private_key,
             remote_bind_address=('localhost', 1521) # default Oracle DB port
    )
    return server

def database_connection():

    data_source_name = cx_Oracle.makedsn("localhost",
                                         server.local_bind_port,
                                         service_name=database_server_sid)

    connection = cx_Oracle.connect(database_username,
                                   database_password,
                                   data_source_name, 
                                   mode=cx_Oracle.SYSDBA) # If logging in with SYSDBA privs,
                                                          # leave out if not.
    return connection

def database_execute():

    connection = database_connection()

    cursor = connection.cursor()
    
    for row in cursor.execute("SELECT * FROM HELLO_WORLD_TABLE"):
        print(row)
    
if __name__ == '__main__':

    server = server_connection()
    server.start()                      # start remote server connection

    connection = database_connection()  # create Oracle database connection

    database_execute()                  # execute query

    connection.close()                  # close Oracle database connection
    server.stop()                       # close remote server connection

기본 터널을 통해 Oracle 데이터베이스에 액세스하는 경우 다음 코드만 수정하면 됩니다.

def server_connection():

server = SSHTunnelForwarder(
         remote_ip_address, # public IP of bastion server
         ssh_username=remote_os_username,
         ssh_password=ssh_private_key,
         remote_bind_address=('localhost', 1521),
         local_bind_address=('0.0.0.0', 3333) # Suppose local bind is '3333'
)
return server

언급URL : https://stackoverflow.com/questions/3521692/how-can-i-access-oracle-from-python

반응형