개발

파이썬 오라클 연결 및 오류 확인

에드몽단테스 2025. 1. 6. 18:51

파이썬에서 오라클에 접속할 수 있도록 라이브러리를 설치한다.

pip install oracledb

 

간단한 예제 소스

import oracledb

def call_bms_holilay_user():
    '''
    매일 특정 시간에 시놀로지 챗으로 휴가자 정보를 보낸다.
    '''

    # 오늘날짜
    today_date = datetime.now().strftime('%Y%m%d')

    query_holiday = f'''
        
    '''
    
    with oracledb.connect(user=db.BMS_DB['user'], password=db.BMS_DB['password'], dsn=db.BMS_DB['dsn']) as connect:
        with connect.cursor() as cursor:
            cursor.execute(query_holiday)

            rows = cursor.fetchall()
            result_list = []

            for row in rows:
                name = row[2] # row값이 튜플이다. dict가 아니기 때문에 index로 값을 가져와야 한다.
                div = ''
                result_list.append(f'{name}님은 금일 {div}입니다.')

            if len(result_list) > 0 :
                title = '금일 휴가자입니다.'                
                message = '\n'.join(result_list)

                util.send_cynology_message(title, message)

oracledb.exceptions.OperationalError: DPY-6005: cannot connect to database

그런데 접속 오류가 났다.

oracledb.exceptions.OperationalError: DPY-6005: cannot connect to database (CONNECTION_ID=4vyk4a65bIPsCYFcETr31Q==).
DPY-3010: connections to this database server version are not supported by python-oracledb in thin mode
Help: https://python-oracledb.readthedocs.io/en/latest/user_guide/troubleshooting.html#dpy-3010

 

데이터베이스에 접속할 수 없다는 오류였다. 오라클 서버의 버전이 낮아서 생긴 문제일 수도 있으나, 오라클 인스턴트 클라이언트를 윈도우용으로 설치 후 경로를 설정하니 간단하게 해결하였다.

 

https://www.oracle.com/kr/database/technologies/instant-client/downloads.html

 

Oracle Instant Client Downloads | Oracle 대한민국

 

www.oracle.com

def call_bms_holilay_user():
    '''
    매일 특정 시간에 시놀로지 챗으로 휴가자 정보를 보낸다.
    '''

    # 오늘날짜
    today_date = datetime.now().strftime('%Y%m%d')

    # 오라클 클라이언트 초기화
    oracledb.init_oracle_client(lib_dir=config.BMS['ORACLE_CLIENT_LIB_PATH'])

    query_holiday = f'''        
    '''

 

init_oracle_client() 메소드를 추가하여 설치한 오라클 인스턴트 클라이언트의 경로를 설정하였다.

 

이제 소스가 정상 동작하는 것을 확인하였고, 리눅스 서버에서 테스트를 진행하였다.

CentOS 7.9를 사용하고 있었기에 리눅스용 라이브러리를 다운로드한 후 동일하게 진행하였다.

 

https://www.oracle.com/kr/database/technologies/instant-client/linux-x86-64-downloads.html

 

Instant Client for Linux x86-64 (64-bit) | Oracle 대한민국

Base - one of these packages is required Tools - optional packages Development and Runtime - optional packages

www.oracle.com

 

기본 버전과 약간 가벼운 버전(용량 차이?) 모두 테스트 해 보았다.

oracledb.exceptions.DatabaseError: DPI-1047

그런데 또 오류가 났다.

oracledb.exceptions.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://python-oracledb.readthedocs.io/en/latest/user_guide/initialization.html for help
Help: https://python-oracledb.readthedocs.io/en/latest/user_guide/troubleshooting.html#dpi-1047

 

설치한 경로를 못 찾는 오류였다.

관련 링크를 찾아서 확인해봤다.

https://python-oracledb.readthedocs.io/en/latest/user_guide/troubleshooting.html#dpi-1047

 

정확한 해석은 아니지만 윈도우나 맥의 경우 init_oracle_client()에 lib_dir 매개변수를 전달하고 리눅스에서는 넣지 말라는 뜻인 것 같다. 대신에 리눅스에서는 LD_LIBRARY_PATH를 추가하라고 페이지 밑에 나와 있었다.(캡처는 안 함)

 

그래서 매개변수를 제거하고

oracledb.init_oracle_client()

 

. bashrc에 환경변수를 추가하였다.

export LD_LIBRARY_PATH=/usr/local/instantclient_23_6:$LD_LIBRARY_PATH

 

/lib64/libc.so.6: version `GLIBC_2.27' not found

그랬더니 이번엔 다른 오류가 나왔다.

oracledb.exceptions.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "/lib64/libc.so.6: version `GLIBC_2.27' not found (required by /usr/local/instantclient_23_6/libclntsh.so)". See https://python-oracledb.readthedocs.io/en/latest/user_guide/initialization.html for help
Help: https://python-oracledb.readthedocs.io/en/latest/user_guide/troubleshooting.html#dpi-1047

 

"GLIBC_2.27"가 없다는 오류인데, 명령어를 통해 서버의 GLIBC 버전을 확인할 수 있다.

[root@web ~]# ldd --version
ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
이 프로그램은 공개 소프트웨어입니다; 복사조건은 소스를 참조하십시오.  상품성
이나 특정 목적에 대한 적합성을 비롯하여 어떠한 보증도 하지 않습니다.
만든 사람: Roland McGrath 및 Ulrich Drepper.

서버의 GLIBC 버전은 2.17었다.

버전을 올리면 괜찮을까 생각했는데, 찾아보니 버전을 올리지 말란다.

이 라이브러리가 업데이트가 되면 다른 소프트웨어에 영향이 갈 수 있으니 올리지 말라고 했다.

그래서 오라클 다운로드 사이트를 다시 찾아봤다. 혹시 이전 버전이 있을까 하고.

그랬더니 다운로드 하단에 glibc 2.14 버전으로도 제공하고 있었다.

 

이 버전을 다운로드하여 동일하게 설정 후 .bashrc에도 설정하니 정상적으로 오라클에 접근이 되었다.

export LD_LIBRARY_PATH=/usr/local/instantclient_21_16:$LD_LIBRARY_PATH

 

 

반응형