Almost-Native

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

Java 프로그램 개발, IT

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

2022. 6. 11. 20:51

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

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

 

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

 

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

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

 

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

 

 
import oracledb
 
# create table BLOB_TBL ( id NUMBER, bb BLOB ) lob (bb) store as SecureFile;
 
 
#####################################################################################################
# DB 접속
#####################################################################################################
con = oracledb.connect(user="scott", password="tiger", dsn="192.168.1.171:1521/ORA19")
oracledb.defaults.fetch_lobs = False
cursor = con.cursor()
nKey = 2
 
 
#####################################################################################################
# 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
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 oracledb

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

 

con = oracledb.connect(user="scott", password="tiger", dsn="192.168.1.171:1521/ORA19")

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

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

 

oracledb.defaults.fetch_lobs = False

 : cx_Oracle 라이브러리를 사용할때에는 output_type_hander() 함수를 만들어서 사용했었는데, 이걸 대체하는 문장입니다. 한결 간결해졌습니다.

 

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 는 조회할때 사용할 구분을 위한 변수입니다. 2 값을 넣었습니다.

 

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