직장에서 파이썬 이미지를 다운로드하는 일이 있었습니다. TOAD 프로그램을 사용하는 방법도 있으나 직접 사용하기에 너무 비싸기 때문에 파이썬과 오라클을 연동하여 이미지를 설치하게 되었습니다.
바로가기
oracledb |
모듈 다운로드(oracledb) |
프로그램 기능 및 운영 순서 |
소스코드 |
oracledb
Oracle DB와 상호 작용하기 위해 파이썬에서 사용하는 oracledb 모듈은 오라클과 효율적인 DB 통신을 담당합니다. 해당 모듈을 이용하여 DB에 연결하고 쿼리를 실행하며 결과를 처리하는 기능을 제고합니다. oracledb 모듈은 오라클 클라이언트 라이브러리를 이용하여 작동하므로 설치 및 설정이 필요합니다. 이를 통해 Python 애플리케이션은 Oracle 데이터베이스와 상호 작용하여 데이터를 검색, 조작 및 관리할 수 있습니다.
주요 명령어는 다음과 같습니다.
1. 연결(Connection)
- connect(user,password,dsn) - DB에 연결
- (user - 사용자이름, password - 암호, dsn - 데이터 주소및 소스 이름)
2. 커서(Cursor)
- cursor() - 쿼리를 실행하기 위한 커서 객체 생성
3. 쿼리 실행(Executing Queries)
- execute(quary *parameter) - SQL 쿼리를 실행합니다.
- (quary - 실행할 쿼리, parameter - 필요한 매개변수)
4. 결과 처리(Handling Results)
- fetchone() - 쿼리 결과 집합에서 한 행을 가져옵니다.
- fetchall() - 쿼리 결과 집합에서 모든 행을 가져옵니다.
- fetchmany() - 지정된 크기의 행을 가져옵니다.
5. 트랜잭션 관리(Transaction Management)
- commit() - 트랜잭션을 커밋합니다.
- rollback() - 트랜잭션을 롤백합니다.
6. 연결종료 (Closing Connection)
- close() - 데이터베이스의 연결을 종료합니다.
모듈 다운로드(oracledb)
※ 윈도우11 64bit 을 기준으로 작성하였습니다.
1. pip를 이용하여 패키지를 설치합니다.
pip install oracledb
2. 다음 링크에서 오라클 클라이언트 라이브러리를 설치합니다.
https://www.oracle.com/database/technologies/instant-client/downloads.html
설치 과정은 다음과 같습니다.
(1) - ' Base - one of these packages is required'에 있는 패키지를 설치합니다.
(2) - 다운로드 후 압축한 파일을 C 드라이버에 둡니다.
(3) - 다음과 같이 실행 - 시스템 설정 - 환경변수 path 값을 설정합니다.
저는 C 드라이버에 직접 파일을 둬서 아래의 환경 변수 값을 두었습니다.
- C:\instantclient_19_22
추가로
여기서 중요한 것은 파이썬의 명령어 집합과 오라클 클라이언트의 명령어 집합이 같아야 합니다. (32bit - 32bit, 64bit - 64bit)
또한 오라클 DB 버전과 오라클 클라이언트 라이브러리의 버전도 같아야합니다.
버전이 다른 경우 오류가 나옵니다.
프로그램 기능 및 운영 순서
프로그램의 운영 순서는 다음과 같습니다.
- DB를 연결합니다.
- 쿼리를 실행합니다.
- 해당 결과를 바탕으로 순서대로 이미지를 다운로드 합니다.
이미지를 다운로드 할때 과정으로
(1) - 다운로드 할 이미지가 있는지 확인합니다.
(2) - BLOB에서 변환된 이미지 파일이 손상되었는지 확인한다.
(3) - RGB 규격이 아닌 경우 RGB 규격으로 바꾼다.
편의 사항으로 로그와 다운로드 디렉터리 생성을 하였습니다.
소스코드
import oracledb
import io
import os
from PIL import Image
import logging
#로그 설정
logging.basicConfig(filename='log.txt', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
#DB 연결
# 연결 정보 설정
host = '호스트'
port = '포트'
service_name = 'SID'
user = '사용자'
password = '패스워드'
# Oracle DB에 연결
oracledb.init_oracle_client(lib_dir=r"C:\instantclient_19_22")
connection = oracledb.connect(user=user, password=password, dsn=oracledb.makedsn(host, port, service_name=service_name))
oracledb.defaults.fetch_lobs = False
#이미지 출력 쿼리문
sql_query = "SELECT T1.PHOTO, T1.STUDENT_NUM FROM EXAMPLE T1 WHERE T1.STUDENT_NUM LIKE :student || '%'"
#WHERE 값
student = '12345' #student값이 ''인 경우 전체를 조회한다
#쿼리전송
cursor = connection.cursor()
cursor.execute(sql_query, student=student)
#디렉토리 생성
download_dir = "./downloads"
os.makedirs(download_dir, exist_ok=True)
os.chdir(download_dir)
#쿼리 결과 추출
rows = cursor.fetchall()
i = 1
if rows:
for row in rows:
photo_blob = row[0]
student_num = row[1]
# BLOB to JPG
try:
image_stream = io.BytesIO(photo_blob)
image = Image.open(image_stream)
image.load() # 이미지를 로드하여 손상 여부를 확인합니다.
except Exception as e:
error_msg = f"이미지가 손상되었습니다. 건너뜁니다. ({student_num})({e})"
print(error_msg)
logging.error(error_msg)
continue
#이미지 모드 확인 및 변환
if image.mode != "RGB":
image = image.convert("RGB")
filename = f"{student_num}.jpg"
image.save(filename)
print(f"다운로드완료: {filename} ({i})")
i += 1
else:
no_photos_msg = "지정된 ID에 대한 사진이 없습니다."
print(no_photos_msg)
logging.info(no_photos_msg)
if i > 1:
success_download_msg = f"다운로드를 완료하였습니다.({i-1}건)"
print(success_download_msg)
logging.info(success_download_msg)
#쿼리종료
cursor.close()
connection.close()
'컴퓨터 > Python' 카테고리의 다른 글
Python (25) - 원주율(π)을 구해보자 (0) | 2024.08.15 |
---|---|
Python (24) - 파이썬으로 MySQL 다루기 (PyMySQL) (0) | 2024.06.08 |
Python (22) - 로또 API이용하여 당첨번호를 크롤링해보자 (1) | 2024.01.29 |
Python (21) - 파이썬을 이용하여 Beep로 연주하기 (winsound) (2) | 2023.10.17 |
Python (20) - CSV파일을 다뤄보자 (CSV) (1) | 2023.08.21 |