일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- Python
- 게임기
- 관광
- 왕좌의게임
- 영어 유머
- 모바일레전드
- 체스-TD
- Mobile Legends
- OGGMA
- 오라클
- 영어유머
- 가볼만한곳
- English Joke
- java program
- MLBB
- 임바 오토체스
- Imba Auto Chess
- 심플한 게임
- 이솝우화
- Chess-TD
- 영어공부
- english study
- 골든게이트
- 오큘러스
- oracle
- 게임
- 영어독해
- 독해연습
- 여행
- 롤
- Today
- Total
Almost-Native
파이썬에서 Oracle DB 로 BLOB 데이터 읽기/쓰기하는 샘플 예제 (oracledb 라이브러리 이용) 본문
파이썬에서 Oracle DB 로 BLOB 데이터 읽기/쓰기하는 샘플 예제 (oracledb 라이브러리 이용)
2022. 6. 11. 20:51Phyton 에서 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 파일이 생성된 것을 확인할 수 있습니다.