cmod.ify
파이썬 & MariaDB 연동 본문
728x90
반응형
1. 데이터베이스 접속 준비물
프로그래밍 언어(Python)가 DB에 접속하려면 다음의 5가지 정보가 반드시 필요함.
- Host: 서버 위치 (내 컴퓨터라면 localhost 또는 127.0.0.1)
- Port: MariaDB 기본값은 3306
- Database: 접속할 DB 이름 (예: hapi)
- User/PW: 접속 계정 및 비밀번호
- Driver: 인터페이스 역할을 하는 라이브러리 (파이썬용: pymysql)
2. 환경 설정 및 드라이버 설치
터미널(또는 CMD)에서 아래 명령어로 라이브러리를 설치함.
pip install pymysql
3. 데이터베이스 접속 및 해제
안전한 연동을 위해 try-except-finally 구문을 사용하는 것이 정석임.
import pymysql
con = None
try:
con = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='여기에_비밀번호_입력',
database='hapi',
charset='utf8mb4'
)
print("연결 성공:", con)
except Exception as e:
print("접속 실패:", e)
finally:
if con:
con.close() # 작업 후 반드시 닫아줘야 함
4. 데이터 조작 (DML: INSERT, UPDATE, DELETE)
보안과 실수를 방지하기 위해 바인딩 변수(%s)를 사용하는 튜플 대입 방식을 권장함.
- Cursor 객체: SQL을 실행하는 '실행 도구'
- execute(): SQL 문장 실행
- commit(): 변경 사항 확정 (필수)
cursor = con.cursor()
# 1. 삽입 (INSERT) - %s와 튜플 활용
sql = "INSERT INTO usertbl VALUES(%s, %s, %s, %s, %s, %s)"
data = ('Wt', '윈터', 2001, '한국', '01012345678', '2001-01-01')
cursor.execute(sql, data)
# 2. 수정 (UPDATE)
cursor.execute("UPDATE usertbl SET name=%s WHERE name=%s", ('가을', '윈터'))
con.commit() # 트랜잭션 확정
5. 데이터 조회 (DQL: SELECT)
조회는 결과를 가져오는 과정이므로 commit이 필요 없으며, 결과 추출 메서드를 사용함.
- fetchone(): 결과 중 딱 1개의 행만 튜플로 리턴
- fetchall(): 결과 전체를 튜플의 튜플(또는 리스트) 형태로 리턴
cursor.execute("SELECT * FROM usertbl")
# 전체 데이터 순회하며 출력
result = cursor.fetchall()
for record in result:
print(record)
6. 파이썬에서 프로시저(Procedure) 실행
데이터베이스에 미리 저장해둔 프로시저를 파이썬에서 호출할 때는 execute 대신 전용 메서드인 callproc을 사용합니다.
- 메서드: cursor.callproc('프로시저이름', 인수튜플)
- 특징: 매개변수는 반드시 튜플(Tuple) 형태로 전달해야 합니다.
- 주의: 프로시저 내부에서 데이터 변경(DML)이 일어난다면 호출 후 반드시 con.commit()을 해주어야 합니다.
DROP PROCEDURE IF EXISTS myproc;
DELIMITER //
CREATE PROCEDURE myproc
(IN _userid CHAR(15), IN _name VARCHAR(20), _birthyear int,
IN _addr CHAR(10), IN _mobile char(11), IN _mdate date)
BEGIN
INSERT INTO usertbl VALUES(_userid, _name, _birthyear, _addr, _mobile, _mdate);
END //
DELIMITER;
CALL myproc('bsz', '배수지', 1994, '광주', '01022223333', '1994-01-01');
select *
from usertbl;
# 프로시저 호출 예시
# 'myproc'이라는 이름의 프로시저에 6개의 인수를 전달
cursor.callproc('myproc', args=('momo', '모모', 1996, '교토', '01033334444', '1996-01-01'))
# 변경 사항 반영
con.commit()
print("프로시저 실행 및 커밋 완료")
7. BLOB(Binary Large Object) 데이터 연동
이미지, 오디오, 비디오 같은 비정형 데이터를 이진(Binary) 형태로 DB에 직접 저장할 때 사용합니다.
(1) 테이블 생성 (BLOB 타입)
용량에 따라 TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB 등을 선택합니다.
CREATE TABLE sample (
userid CHAR(15),
filename VARCHAR(1000),
filecontent LONGBLOB -- 대용량 바이너리 데이터 저장용
);
(2) 파이썬에서 파일 읽어 DB에 쓰기 (INSERT)
파일을 읽을 때는 '바이너리 읽기' 모드인 'rb'를 사용해야 합니다.
# 1. 로컬 파일을 바이너리 형태로 읽기
filename = "hamster.jpg"
with open(filename, 'rb') as f:
photo = f.read() # 이미지 파일의 이진 데이터
# 2. DB에 데이터 삽입
sql = 'INSERT INTO sample VALUES (%s, %s, %s)'
# 바이너리 데이터(photo)를 튜플에 담아 실행
cursor.execute(sql, ('햄스터', filename, photo))
con.commit()
print("이미지 데이터 저장 성공")
(3) DB에서 이진 데이터 읽어 파일로 저장하기 (SELECT)
DB에서 가져온 데이터를 파일로 만들 때는 '바이너리 쓰기' 모드인 'wb'를 사용합니다.
# 1. 데이터 조회
cursor.execute("SELECT * FROM sample")
data = cursor.fetchone() # (userid, filename, filecontent) 형태로 가져옴
# 2. 가져온 이진 데이터를 파일로 복원
# data[1]은 파일 이름, data[2]는 바이너리 내용
with open("restored_" + data[1], 'wb') as f:
f.write(data[2])
print(f"'{data[1]}' 파일이 성공적으로 복원되었습니다.")
💡 핵심 요약
- 커서(Cursor): SQL을 실행하고 결과를 담는 그릇임.
- 바인딩 변수(%s): SQL 인젝션 공격을 방지하고 코드 가독성을 높여줌. 직접 문자열을 더하는 방식보다 훨씬 안전함
- 트랜잭션: INSERT, UPDATE, DELETE 후에는 반드시 con.commit()을 호출해야 실제 DB에 반영됨.
- 접속 해제: 파이썬 스크립트가 끝나기 전 반드시 close()를 호출해 DB 연결 자원을 반납해야 함.
- callproc: 프로시저 실행 전용 메서드이며 인수는 튜플로 넘긴다.
- BLOB: 이미지나 실행 파일 등을 저장하는 타입이다.
- 'rb' & 'wb': 파이썬에서 파일을 다룰 때 바이너리 모드를 지정하는 것이 가장 중요하다. (이미지 저장/읽기 시 필수)
- 보안: DB에 직접 파일을 넣으면 관리가 편하지만, DB 용량이 커질 수 있으므로 실무에서는 파일 경로만 저장하는 방식과 잘 비교해서 사용한다.
728x90
반응형