-
반응형
파이썬 코딩시 데이터베이스와 연동 할 일이 많이 있습니다.
이번 포스팅은 데이버베이스 중 많이 사용하는 oracle 과 연동하는 방법에 대해 알아 보겠습니다.
이전에 티베로와 연동하는 방법에 대해 포스팅 한적이 있는데 이때는 티베로 라이브러리를 제공하지 않아 ODBC 를 사용하여 연동하였습니다.
오라클도 표준으로 제공하는 OJDBC 를 사용 할 수 도 있으나, 파이썬에서 오라클과 연동 할 수 있는 cx_oracle 이라는 라이브러리를 제공하므로 이것을 사용 하는 예제를 포스팅 합니다.
티베로 연동시 티베로에서 제공하는 ODBC 드라이버를 설치하고 파이썬 ODBC (pyodbc) 라이브러리를 사용하였습니다.
비슷한 개념으로 파이썬의 cx_oracle 을 사용하고 파이썬 동작 시스템(PC)에 오라클 클라이언트를 설치해야 합니다.
본 포스팅에서는 오라클 클라이언트 설치는 되어 있다는 가정하에 포스팅합니다.
먼저 파이썬 라이브러리 cx_Oracle을 설치 합니다.
C:\py_test>pip install cx_oracle
Collecting cx_oracle
Downloading https://files.pythonhosted.org/packages/b2/6b/b97c28274add4e3e06e4fa9284c4c3b94fead66f63a9e0a7f1e30a8d028a/cx_Oracle-8.0.0-cp38-cp38-win_amd64.whl (203kB)
|████████████████████████████████| 204kB 731kB/s
Installing collected packages: cx-oracle
Successfully installed cx-oracle-8.0.0
cx_oracle 모듈을 import 합니다.
import cx_Oracle
먼저 오라클에 접속합니다. 다음을 인수로 전달합니다.
userid = 오라클 사용자 계정
password = 계정에 대한 패스워드
ip:port/SID = Oracle Database의 IP : DB사용 Port / SID 명
conn = cx_Oracle.connect( ‘userid’, ‘password’ , ‘IP:port/SID’ , encoding='UTF-8', nencoding='UTF-8' )
DB에 접속을 하였으니, 실행할 쿼리를 선언합니다.
마지막 부분에 :seq_num 은 변수 입니다. 오라클은 쿼리에 변수를 정의할 경우 ‘:’ 기호를 사용합니다. 다음엔 seq_num 은 변수 명 입니다.
만약 변수를 사용하지 않고 순서로 쿼리에 파라메타를 전달 할 수 있습니다.
:0 :1 …..로 정의할 수 있습니다. 첫번째는 0 부터 시작합니다.
예를 들면 아래와 같이 할 수도 있습니다. 바인딩 변수 라고 합니다.
select int1, int2, str1, str2 from test where int1 > :0 and str2 = :1
sql = """
select batch_log_seq, batch_id, run_stat_cd, run_stt_dtm, run_end_dtm, run_sec, nvl(err_desc,'No Data')
from TB_ERP_BATCH_LOG
where batch_log_seq > :seq_num
"""
with 구문을 사용하면 cursor() 를 close 하지 않아도 됩니다.
만약 with 를 사용하지 않고 cursor() 를 오픈하면 꼭 close 해 주어야 합니다.
아래는 cursor를 오픈하고 SQL 문을 execute() 로 실행합니다. 변수 전달도 해 주었습니다.
조회한 데이터를 한꺼번에 모두 가져오려면 fetchall() 하면되고 처음 하나의 row 를 가져오려면 fetchone() 합니다.
데이터의 양에 따라 적절하게 사용하면 됩니다.
with conn.cursor() as cur_ora:
cur_ora.execute(sql, seq_num=10 )
res = cur_ora.fetchall()
참고로 변수가 없는 쿼리 문이면 아래와 같이 사용합니다.
cur_ora.execute( "select * from tab" )
아래는 전체 데이터를 가져와서 하나의 row 씩 출력해 준 것입니다.
for row in res:
print( row)
오라클에 select 이외의 insert, update, delete 를 하면 commit() 또는 rollback() 을 해야 합니다.
commit() 은 변경된 내용을 DB에 적용하라는 뜻 입니다. rollback()은 이전 상태로 되돌린다는 뜻 입니다.
만약 1000 행을 입력하는 프로그램이 있다고 가정하고 500 행 까지 insert를 하였는데 501 행 에서 오류가 발생 했다면 500 행 까지 insert를 할지 아님 모두 insert를 하지 말지 등을 정해야 합니다. 이 떄 commit 또는 rollback 을 사용 합니다.
이상으로 cx_oracle의 간단 사용법을 정리해 보았습니다.
반응형'IT 이야기 공간 > 프로그램 언어' 카테고리의 다른 글
파이썬(python) AES 암호화 복호화 예제 - pycryptodomex (0) 2020.08.08 파이썬(python) SSH client를 이용한 네트워크 장비, 리눅스 서버 통신 방법 - paramiko (0) 2020.08.06 파이썬(python) 티베로 DB 접속 방법 - ODBC (0) 2020.08.05 파이썬(python) 일자 계산, 날짜 비교, 요일 구하기 (0) 2020.08.04 파이썬(python) 현재 날짜 시간 형식 포맷 변환 UTC datetime strfprint strprint (0) 2020.08.03