Cloudera CDH/CDP 및 Hadoop EcoSystem, Semantic IoT등의 개발/운영 기술을 정리합니다. gooper@gooper.com로 문의 주세요.
*참고 : https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html
(pip, rpm, zip파일등을 이용한 다양한 설치 방법이 자세하게 설명되어 있음)
1. python : 2.7.5, OS : RHEL7.4 64bit, Oracle database : 11.2인 Linux환경에서 RPM을 이용하여 설치/설정하는 방법이다.
2. cx_Oracle을 Linux에 설치한다.
- 다운로드 URL : https://pypi.org/project/cx-Oracle/5.3/#files
- 다운로드 받은 rpm파일을 서버에 업로드 한후 다음 명령으로 설치한다.
: sudo yum install cx_Oracle-5.3-11g-py27-2.x86_64.rpm
3. Oracle Client를 설치한다.
- 다운로드 URL : https://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/
- 다운로드 받은 rpm파일을 서버에 업로드 한후 다음 명령으로 설치한다
: sudo yum install oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64.rpm
4. Instant client 19이후 버젼에서는 관련 라이브러리를 자동으로 잡아주지만 설정되지 않는 경우는 다음과 같이 설정해준다.
sudo sh -c "echo /usr/lib/oracle/19.9/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig (확인 : sudo ldconfig -v)
5. 4번과 같이 해도 python에서 "import cx_Oracle"하면 ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory같은 오류가 발생하는데..
이런 경우는 LD_LIBRARY_PATH값을 확인하여 그 경로에 가서(cd ${LD_LIBRARY_PATH}) oracle instant client가 설치된 경로의 library파일을 링크 걸어준다.
(예, sudo ln -s /usr/lib/oracle/19.9/client64/lib/libclntsh.so.19.1 libclntsh.so.11.1)
6. python shell을 실행하여 "import cx_Oracle"을 입력하고 엔터하여 import시 오류가 발생하지 않는지 확인한다.
7. 아래와 같은 python프로그램을 작성하여 수행해본다.
-------------------------------------------------------------------------
import cx_Oracle
import os
#한글지원방법
os.putenv('NLS_LANG', '.UTF8')
# 함수 정의
def connect():
#라이브러리 연결(이거 설정하면 AttributeError: 'module' object has no attributes 'init_oracle_client'오류가 발생한다. 이거 생략하고 실행하면 잘 수행됨)
#cx_Oracle.init_oracle_client(lib_dir=r"D:\8_Programs\Oracle\instantclient_19_9")
#cx_Oracle.init_oracle_client(lib_dir=r"/usr/lib/oracle/19.9")
con_ip='localhost:1526/testdb'
con_id='user'
con_pw='password'
#연결에 필요한 기본 정보(유저, 비밀번호, 데이터베이스 서버 주소)
connection = cx_Oracle.connect(con_id,con_pw, con_ip)
cursor = connection.cursor()
cursor.execute("""
select *
from member
where name='홍길동'
""")
for list in cursor:
print(list)
cursor.close()
connection.close()
# 함수 실행
connect()
-------------------------------------------------------------------------