일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 골든게이트
- english study
- 게임
- 가볼만한곳
- java program
- Imba Auto Chess
- 심플한 게임
- 롤
- English Joke
- 영어공부
- 모바일레전드
- 관광
- OGGMA
- 오라클
- 영어유머
- 체스-TD
- 영어독해
- Mobile Legends
- Chess-TD
- 오큘러스
- 독해연습
- 영어 유머
- 왕좌의게임
- 이솝우화
- oracle
- MLBB
- Python
- 임바 오토체스
- 게임기
- 여행
- Today
- Total
Almost-Native
파이썬에서 Oracle DB 로 BLOB 데이터 읽기/쓰기하는 샘플 예제 (cx_Oracle 라이브러리 이용) 본문
파이썬에서 Oracle DB 로 BLOB 데이터 읽기/쓰기하는 샘플 예제 (cx_Oracle 라이브러리 이용)
2022. 6. 11. 19:19Phyton 에서 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 파일이 생성된 것을 확인할 수 있습니다.
'Java 프로그램 개발, IT' 카테고리의 다른 글
파이썬에서 Oracle DB 로 BLOB 데이터 읽기/쓰기하는 샘플 예제 (oracledb 라이브러리 이용) (0) | 2022.06.11 |
---|---|
파이썬에서 Oracle DB 로 대용량 BLOB 데이터 읽기/쓰기하는 샘플 예제 (cx_Oracle 라이브러리 Streaming 방식) (0) | 2022.06.11 |
파이썬에서 Oracle DB 접속하여 데이터 읽기/쓰기하는 방법 설명 및 샘플예제 (0) | 2022.06.11 |
Oracle Database 버전별 Windows OS 설치가능 버전 정리 (0) | 2022.05.06 |
kubeadm join 실행시 에러 : CGROUPS_PIDS: missing (0) | 2022.01.07 |