Almost-Native

파이썬에서 Oracle DB 로 BLOB 데이터 읽기/쓰기하는 샘플 예제 (cx_Oracle 라이브러리 이용) 본문

Java 프로그램 개발, IT

파이썬에서 Oracle DB 로 BLOB 데이터 읽기/쓰기하는 샘플 예제 (cx_Oracle 라이브러리 이용)

2022. 6. 11. 19:19

Phyton 에서 cx_Oracle 라이브러리를 이용해서 BLOB 데이터를 등록(Insert) 하고, 조회(Select) 하는 샘플 프로그램입니다.

Oracle DB 에서 BLOB 데이터 타입은 이미지, 동영상 등의 Binary Data 를 저장할 때 사용됩니다.

 

테스트를 위해 아래와 같이 오라클DB 에 미리 BLOB_TBL 이라는 테이블을 만들어두었습니다.

 

BLOB_TBL 테이블의 BB 컬럼에 156MB.mov 동영상 파일을 Insert 한후,

이를 다시 Select 하여 156MB_output.mov 동영상 파일로 출력하겠습니다.

 

파이썬 소스코드는 아래와 같습니다.

 

 
import cx_Oracle
 
# create table BLOB_TBL ( id NUMBER, bb BLOB ) lob (bb) store as SecureFile;
 
#####################################################################################################
# output_type_handler 함수 (Select 할때만 필요)
#####################################################################################################
def output_type_handler(cursor, name, default_type, size, precision, scale):
    if default_type == cx_Oracle.DB_TYPE_CLOB:
        return cursor.var(cx_Oracle.DB_TYPE_LONG, arraysize=cursor.arraysize)
    if default_type == cx_Oracle.DB_TYPE_BLOB:
        return cursor.var(cx_Oracle.DB_TYPE_LONG_RAW, arraysize=cursor.arraysize)
 
 
#####################################################################################################
# DB 접속
#####################################################################################################
con = cx_Oracle.connect("scott""tiger""192.168.1.171:1521/ORA19", encoding="UTF-8")
cursor = con.cursor()
nKey = 1
 
 
#####################################################################################################
# Insert ( < 1GB )
#####################################################################################################
# --- 파일 Read
fr = open('156MB.mov''rb')
blob_data = fr.read()
fr.close()
 
# --- Write to DB
cursor.execute("insert into BLOB_TBL (id, bb) values (:1, :2)", [nKey, blob_data])
con.commit()
 
 
#####################################################################################################
# Select ( < 1GB )
#####################################################################################################
# --- Read from DB
con.outputtypehandler = output_type_handler
cursor.execute("select bb from BLOB_TBL where id = :1", [nKey])
blob_data = cursor.fetchone()
 
# --- 파일 Write
fw = open("156MB_output.mov""wb")
fw.write(blob_data[0])
fw.close()
 
 
con.close()
 
 

 

import cx_Oracle

 : cx_Oracle 라이브러리를 사용하기 위해서 Import 합니다.

 

def output_type_handler(cursor, name, default_type, size, precision, scale):

 : CLOB Type 인지, BLOB Type 인지에 따라 환경을 잡아주는 이벤트 핸들러 함수입니다.

   Select 할 때만 필요합니다.

   Select 하기전에 con.outputtypehandler = output_type_handler  와 같이 설정합니다.

 

con = cx_Oracle.connect("scott", "tiger", "192.168.1.171:1521/ORA19", encoding="UTF-8")

 : Oracle DB 에 접속하기 위해서 DB User, Password 와 접속할 DB 의 IP, Port, Service명 등의 정보가 필요합니다.

   Port, 서비스명을 모르는 경우, 해당 DB 서버에서 lsnrctl status 커맨드로 확인할 수 있습니다.

 

fr = open('156MB.mov', 'rb')
blob_data = fr.read()

 : 현재 디렉토리에 있는 156MB.mov 파일을 binary mode 로 읽어서 blob_data 변수에 저장합니다.

 

cursor.execute("insert into BLOB_TBL (id, bb) values (:1, :2)", [nKey, blob_data])
con.commit()

 : insert DML SQL 구문을 실행합니다. 파일에서 있는 데이터가 들어있는 blob_data 변수를 SQL 문에서 :2 에 넘겨줍니다.

   nKey 는 조회할때 사용할 구분을 위한 변수입니다. 1 값을 넣었습니다.

 

con.outputtypehandler = output_type_handler

 : blob 이나 clob 데이터타입을 조회하는 경우, 미리 만들어둔 type 핸들러 함수를 지정해줍니다.

 

cursor.execute("select bb from BLOB_TBL where id = :1", [nKey])
blob_data = cursor.fetchone()

 : 조회 SQL 구문을 실행합니다. 조회된 Binary Data 를 다시 blob_data 변수에 저장합니다.

 

fw = open("156MB_output.mov", "wb")
fw.write(blob_data[0])

 : 조회된 BLOB 데이터를 "156MB_output.mov" 파일에 기록합니다.

   앞에서 cursor.fetchone() 함수에서 리턴값이 Tuple 타입이라, blob_data 변수에 있는 데이터를 사용할 때는 Tuple 의 첫번째 값을 사용하기 위해서 blob_data[0] 과 같이 해줘야 합니다.

 

 

실행결과는 아래와 같습니다.

첫번째 조회시(프로그램 실행전)에는 조회되는 건이 없고,

두번째 조회시(프로그램 실행후)에는 1건이 조회되는 것을 확인할 수 있습니다.

 

탐색기에서 확인해보면, 처음에는 156MB.mov 파일만 존재했었고,

 

프로그램 실행후, 156MB_output.mov 파일이 생성된 것을 확인할 수 있습니다.

 

 

Comments