본문 바로가기

Lang

[python]cx_oracle 설정, 사용 예

윈도우 환경에서 파이썬으로 오라클 DB 사용하려고 하니 다른 DB 들과는 달리 연결 설정이 그렇게 쉽지는 않군요.

cx_oracle 을 보통 사용하는 듯 해서 우선 설치.

pip install cx_oracle

cx_oracle 8.0.0 이 별 문제없이 설치 되었다. 문제는 그 다음부터.

cx_oracle 패키지를 소스에서 찾지 못하고 엉뚱한 sqlalchemy.dialects 에 있는 cx_oracle 패키지만 찾거나, 'DPI-1047: Cannot locate a 64-bit Oracle Client library' 에러만 내놓는다.

늘 그렇듯이 문제 생긴 후 매뉴얼 정독.

cx_oracle 사용하려면 오라클 클라이언트 라이브러리를 별도로 설치해주어야 하는 듯.

Basic Light Package 최신 버전(글 쓰는 시점에서 v19.6) 내려 받은 후 ORACLE_HOME 설정.

setX ORACLE_HOME=oracle_client_dir

소스에서 import cx_oracle 에러는 사라졌지만 실행시켜보면 여전히 다음 에러가 난다.

'DPI-1047: Cannot locate a 64-bit Oracle Client library' 

아래 처럼 소스에서 lib_dir 을 직접 지정해주거나 윈도우 환경 변수 'PATH'에 oracle_client_dir 를 추가해준다(리눅스 계열이면 'LD_LIBRARY_PATH'에 경로 추가).

cx_Oracle.init_oracle_client(lib_dir=r"oracle_client_dir")

위 구문 소스에 추가해준 뒤 다시 실행. 하지만 이번에도 역시나 에러.

cx_oracle dpi-1072 version is unsupported windows

사용하려는 오라클 DB 버전을 확인해봤다.

select * from v$version;
=> Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

오라클 클라이언트 라이브러리 페이지에서 DB 버전 지원 내용 일일이 확인하기 귀찮아서 그냥 전 버전(v18.5) 받아서 'lib_dir'만 변경한 후 실행해보았다. 이제사 성공.

DB service name 사용하려면 makedsn 사용해야 한다길래 사용해 본 방식(그런데 그냥 일반적인 connection 스트링 패턴 사용해도 저는 되긴 하더군요)

def __create_engine_ora(self):
    cx_Oracle.init_oracle_client(lib_dir=r"C:\dev\instantclient_18_5")
    oracle_connection_string = (
            'oracle+cx_oracle://{username}:{password}@' +
            cx_Oracle.makedsn('{hostname}', '{port}', service_name='{service_name}')
    )

    engine = create_engine(
            oracle_connection_string.format(
            username='...',
            password='...',
            hostname='*.*.*.*',
            port='1521',
            service_name='...',
        )
    )

    return engine