• 2020. 8. 12.

    by. 윈썸지니

    반응형

    파이썬 코딩시 데이터베이스와 연동 할 일이 많이 있습니다.

    이번 포스팅은 데이버베이스 중 많이 사용하는 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의 간단 사용법을 정리해 보았습니다.

    반응형