※ PyMySQL 설치 및 연결
Python에서 MariaDB(MySQL 포함)와 연동하기 위해서는 PyMySQL 패키지를 사용합니다.
이는 Python에서 MariaDB 서버와 통신하기 위한 DB 드라이버 역할을 하며,
쿼리 실행·결과 조회 등을 수행할 수 있게 해줍니다.
📦 1) 설치
pip install pymysql
📡 2) 데이터베이스 연결
import pymysql
# 데이터베이스 연결
conn = pymysql.connect(
host='localhost',
user='root',
password='root1234',
db='school',
charset='utf8mb4'
)
# 커서(Cursor) 생성
cur = conn.cursor()
print("✅ MariaDB 연결 성공!")
✅ connect(): MariaDB 서버 연결 객체 생성
✅ cursor(): SQL 명령어를 실행하고 결과를 제어하는 커서 객체
✅ charset: 한글 데이터 처리를 위해 반드시 UTF-8 지정
※ DML 실행 (INSERT / UPDATE / DELETE / SELECT)
📥 1) INSERT – 데이터 삽입
sql = "INSERT INTO students (name, age, major) VALUES (%s, %s, %s)"
cur.execute(sql, ("지우", 26, "AI Engineering"))
conn.commit()
print("✅ 데이터 삽입 완료")
✅ %s는 파라미터 자리 표시자이며 SQL 인젝션 방지를 위해 직접 문자열 연결 대신 사용합니다.
✅ conn.commit()을 호출해야 실제 DB에 반영됩니다.
✏️ 2) UPDATE – 데이터 수정
sql = "UPDATE students SET major = %s WHERE name = %s"
cur.execute(sql, ("Computer Science", "지우"))
conn.commit()
print("✅ 데이터 수정 완료")
🗑️ 3) DELETE – 데이터 삭제
sql = "DELETE FROM students WHERE age < %s"
cur.execute(sql, (20,))
conn.commit()
print("✅ 데이터 삭제 완료")
🔍 4) SELECT – 데이터 조회
sql = "SELECT * FROM students"
cur.execute(sql)
# 모든 결과 조회
rows = cur.fetchall()
for row in rows:
print(row)
✅ execute() : SQL 실행
✅ fetchall() : 모든 결과를 리스트로 반환
✅ commit() : INSERT / UPDATE / DELETE 이후에만 필요 (SELECT는 불필요)
※ fetchone / fetchall 활용
조회 결과를 다루는 가장 중요한 메서드는 fetchone()과 fetchall()입니다.
# 단일 행 조회
sql = "SELECT * FROM students WHERE name = %s"
cur.execute(sql, ("지우",))
row = cur.fetchone()
print("📄 단일 행:", row)
# 모든 행 조회
sql = "SELECT * FROM students"
cur.execute(sql)
rows = cur.fetchall()
for r in rows:
print("📄 전체:", r)
✅ fetchone() : 첫 번째 행만 반환 (튜플 형태)
✅ fetchall() : 전체 결과를 리스트로 반환
✅ fetchmany(n) : n개의 행만 반환 (대용량 데이터 처리 시 유용)
※ 프로시저 호출 (Stored Procedure)
데이터베이스에 미리 저장된 SQL 블록인 Stored Procedure를 Python에서 직접 호출할 수 있습니다.
프로시저를 활용하면 복잡한 로직을 DB 서버에서 처리하여 성능을 높이고, 코드 재사용성을 확보할 수 있습니다.
📁 1) 프로시저 생성 (MariaDB)
DELIMITER $$
CREATE PROCEDURE GetStudentByMajor(IN major_name VARCHAR(50))
BEGIN
SELECT name, age FROM students WHERE major = major_name;
END $$
DELIMITER ;
📡 2) Python에서 프로시저 호출
sql = "CALL GetStudentByMajor(%s)"
cur.execute(sql, ("AI Engineering",))
rows = cur.fetchall()
for r in rows:
print("📊 전공별 학생:", r)
✅ CALL 프로시저명(인자) : 저장 프로시저 실행
✅ fetchall() 로 반환값 처리
※ BLOB 데이터 저장 및 불러오기
BLOB(Binary Large Object)는 이미지, 동영상, PDF 등과 같은 이진 데이터를 저장할 수 있는 데이터 타입입니다. Python에서는 read() / write()를 이용해 파일과 연동할 수 있습니다.
📥 1) BLOB 저장
with open("profile.jpg", "rb") as f:
binary_data = f.read()
sql = "INSERT INTO profile_images (student_id, photo) VALUES (%s, %s)"
cur.execute(sql, (1, binary_data))
conn.commit()
print("✅ BLOB 데이터 저장 완료")
📤 2) BLOB 불러오기
sql = "SELECT photo FROM profile_images WHERE student_id = %s"
cur.execute(sql, (1,))
photo = cur.fetchone()[0]
with open("output.jpg", "wb") as f:
f.write(photo)
print("✅ BLOB 데이터 복원 완료")
✅ BLOB 처리 팁:
- 이미지/파일을 직접 DB에 저장하는 대신, 실제 서비스에서는 파일 경로(URL)를 저장하는 방식도 자주 사용됩니다.
- 소규모 데이터는 BLOB 직접 저장, 대용량 파일은 스토리지와 연결하는 전략이 효율적입니다.
※ 전체 실습 코드 예제
import pymysql
# 1. DB 연결
conn = pymysql.connect(
host='localhost',
user='root',
password='root1234',
db='school',
charset='utf8mb4'
)
cur = conn.cursor()
# 2. INSERT
cur.execute(
"INSERT INTO students (name, age, major) VALUES (%s, %s, %s)",
("민준", 24, "Data Science")
)
conn.commit()
# 3. SELECT
cur.execute("SELECT * FROM students")
for row in cur.fetchall():
print("📊 학생:", row)
# 4. UPDATE
cur.execute(
"UPDATE students SET major = %s WHERE name = %s",
("Computer Science", "민준")
)
conn.commit()
# 5. DELETE
cur.execute("DELETE FROM students WHERE name = %s", ("민준",))
conn.commit()
# 6. 프로시저 호출
cur.execute("CALL GetStudentByMajor(%s)", ("AI Engineering",))
for r in cur.fetchall():
print("📘 전공 조회:", r)
# 7. BLOB 저장
with open("profile.jpg", "rb") as f:
photo = f.read()
cur.execute(
"INSERT INTO profile_images (student_id, photo) VALUES (%s, %s)",
(1, photo)
)
conn.commit()
# 8. BLOB 불러오기
cur.execute("SELECT photo FROM profile_images WHERE student_id = %s", (1,))
with open("restored.jpg", "wb") as f:
f.write(cur.fetchone()[0])
print("✅ 전체 프로세스 완료!")
conn.close()
'2025 현대오토에버 모빌리티 SW 스쿨(클라우드 2기) > 데이터베이스' 카테고리의 다른 글
| [Database] 데이터베이스 모델링과 E-R 다이어그램 (0) | 2025.10.07 |
|---|---|
| [Database] Python과 DB 연동 (1) – MongoDB (0) | 2025.10.07 |
| [Database] MongoDB 심화 활용 (0) | 2025.10.07 |
| [Database] NoSQL과 MongoDB 기본 (0) | 2025.10.07 |
| [Database] DML과 트랜잭션(TCL) (0) | 2025.10.07 |