-
파이썬 오라클 연결 및 오류 확인개발 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
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
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
반응형'개발' 카테고리의 다른 글