파이썬 데이터베이스 프로그래밍 완전 정복: MySQL과 PyMySQL 연동하기
파이썬 데이터베이스 프로그래밍 완전 정복
: MySQL과 PyMySQL 연동하기
파이썬으로 데이터베이스를 다룰 수 있다면,
데이터 분석부터 웹 서비스까지 훨씬 유연해진다는 사실 알고 계셨나요?
안녕하세요, 데이터 프로그래밍에 관심 있는 여러분!
오늘은 파이썬으로 MySQL 데이터베이스에 접속하고 데이터를 다루는 방법에 대해 살펴보려 해요.
개발자로서 반드시 익혀야 할 파이썬 DB 연동 기초부터 시작해, 실전에서 바로 쓸 수 있는 예제까지 하나하나 짚어볼게요.
특히 초보자 분들도 따라 하기 쉽도록 PyMySQL 라이브러리를 중심으로 구성했답니다.
자, 그럼 파이썬과 MySQL의 만남, 지금부터 본격적으로 시작해볼까요? 😎
목차
1. MySQL과 파이썬 연동 개요 🛠️
파이썬은 다양한 데이터 분석, 웹 프로그래밍, 자동화 작업에 활용되는 인기 있는 프로그래밍 언어입니다.
그런데 이런 작업의 대부분이 데이터베이스와의 연동을 필요로 한다는 사실, 알고 계셨나요?
그중에서도 MySQL은 오픈소스 관계형 데이터베이스(RDBMS)로 가장 많이 사용되는 시스템 중 하나예요.
웹 개발이나 데이터 분석, 자동화 프로젝트에서 MySQL은 필수 도구처럼 사용되곤 하죠.
특히 WordPress, PHP 기반 웹사이트, Django, Flask와의 연동에서도 핵심적인 역할을 해요.
왜 MySQL인가요?
- 오픈소스이기 때문에 무료로 사용할 수 있음
- 대규모 서비스에서도 안정적으로 운영 가능
- SQL 표준에 기반한 친숙한 쿼리 구조
- 다양한 플랫폼(OS)에서 활용 가능 (Windows, Linux, macOS 등)
파이썬과 MySQL이 만나면?
파이썬에서 MySQL을 사용하기 위해서는 중간에서 연결을 도와주는 라이브러리가 필요합니다.
쉽게 말해, 파이썬이 MySQL이라는 언어를 이해할 수 있도록 통역해주는 도구인 셈이죠.
라이브러리명 | 설명 | 설치 명령어 |
---|---|---|
PyMySQL | 순수 파이썬 기반의 MySQL 드라이버. 가볍고 사용하기 쉬움 |
pip install PyMySQL |
mysql-connector-python | Oracle이 제공하는 공식 MySQL 커넥터 | pip install mysql-connector-python |
mysqlclient | C 기반 드라이버로 성능은 좋지만 설치 난이도 있음 | pip install mysqlclient |
초보자에게는 PyMySQL이 가장 무난한 선택이에요.
이 글에서는 PyMySQL을 중심으로 MySQL 접속 → 데이터 조회 → 입력/수정/삭제 → 클래스 구조화까지 차근차근 설명드릴게요!
2. 어떤 라이브러리를 써야 할까? - PyMySQL vs mysql-connector 등 📦
파이썬에서 MySQL과 연결하려면 전용 드라이버(또는 커넥터)를 설치해야 해요.
이 커넥터는 파이썬 코드가 MySQL 서버에 접속해서 데이터를 주고받도록 도와주는 다리 같은 역할을 해요.
그런데, 이 커넥터도 종류가 여러 가지라 뭘 써야 할지 처음에는 좀 헷갈릴 수 있어요. 😅
여기선 가장 많이 쓰이는 네 가지를 소개하고, 각각의 장단점을 정리해봤어요.
대표적인 MySQL 연동 라이브러리 비교
라이브러리 | 특징 | 설치 명령 |
---|---|---|
PyMySQL | 순수 파이썬 구현. 설치가 쉽고 가볍다. 학습용 및 일반 서비스에 적합. |
pip install PyMySQL |
mysql-connector-python | MySQL 공식 지원 커넥터. 성능도 괜찮고 문서도 충실. |
pip install mysql-connector-python |
mysqlclient | C 기반. 성능은 뛰어나지만 설치 과정이 복잡함 (특히 Windows 환경). |
pip install mysqlclient |
oursql | 예전에는 많이 쓰였지만 현재는 유지보수 중단. 추천 ❌ |
pip install oursql |
👶 초보자에게 추천: PyMySQL
처음 MySQL 연동을 해본다면 PyMySQL을 추천드려요.
설치도 간단하고, 파이썬 문법과도 자연스럽게 어울립니다.
라이브러리 구조도 깔끔해서 SELECT, INSERT, UPDATE, DELETE 같은 기초적인 쿼리부터 시작하기에 딱 좋거든요.
🚀 고성능이 필요하다면?
프로덕션(운영 서버) 환경에서는 mysqlclient를 사용하는 경우도 많습니다.
다만 설치가 까다로울 수 있어서 어느 정도 리눅스와 컴파일 환경에 익숙한 분들에게 적합해요.
다음 단계에서는 본격적으로 MySQL에 접속하는 코드를 작성해볼게요!
어떻게 connect()
함수를 쓰고, 데이터베이스에 로그인하는지 직접 실습하면서 배워보죠. 🎯
3. MySQL 데이터베이스 연결 방법 (connect 함수 활용법) 🔌
자, 이제 본격적으로 MySQL 데이터베이스에 접속해볼 시간이에요!
우리가 사용할 PyMySQL 라이브러리는 간단한 방식으로 DB에 연결할 수 있도록 connect()
라는 함수를 제공합니다.
기본 연결 구조
다음은 PyMySQL을 이용해 로컬 MySQL 서버에 접속하는 가장 기본적인 예제입니다.
import pymysql
# MySQL 접속
conn = pymysql.connect(
host='localhost', # 또는 '127.0.0.1'
user='your_username', # MySQL 사용자 계정
password='your_password', # 비밀번호
db='your_database', # 접속할 DB명
charset='utf8' # 인코딩 설정
)
📌 각 인자 설명
- host: MySQL 서버가 설치된 위치. 로컬이라면 'localhost' 또는 '127.0.0.1'
- user: 접속할 MySQL 계정
- password: 사용자 비밀번호
- db: 사용할 데이터베이스 이름
- charset: 문자 인코딩 설정 (일반적으로 'utf8' 권장)
✅ 접속 성공 여부 확인
try:
conn = pymysql.connect( ... ) # 생략된 연결정보
print("DB 연결 성공!")
except Exception as e:
print("DB 연결 실패:", e)
MySQL 접속은 성공하면 곧바로 쿼리를 실행할 수 있는 커서(cursor)를 생성해 사용할 수 있어요.
이제 다음 단계에서는 이 커서를 이용해 SELECT
쿼리를 실행하고 데이터를 조회해보는 방법을 배워볼게요. 슬슬 재미있어지기 시작하죠? 😄
4. Cursor를 이용한 SELECT 쿼리 실행과 결과 출력 방법 🔍
DB 연결에 성공했다면, 이제는 MySQL의 데이터를 조회(SELECT)해서 화면에 출력해보는 단계로 넘어가볼게요.
여기서 핵심 역할을 하는 게 바로 cursor()
객체입니다.
cursor란?
간단히 말해 cursor는 데이터베이스와 연결된 파이썬 측 커맨드 센터에요.
우리가 SELECT 쿼리를 날리면, cursor가 DB에게 요청하고 그 결과를 받아오는 역할을 해요.
# 커서 생성 및 SELECT 실행
cursor = conn.cursor() # 기본은 튜플로 결과 반환
sql = "SELECT * FROM dept;"
cursor.execute(sql)
# 결과 가져오기
rows = cursor.fetchall()
for row in rows:
print(row) # 튜플 형태로 출력됨
📌 반환 메서드 비교
메서드 | 설명 |
---|---|
fetchall() |
결과 전체를 리스트로 가져옴 |
fetchone() |
한 번에 하나의 행만 가져옴 (다음 호출 시 다음 행) |
fetchmany(n) |
지정한 n개의 행만 가져옴 |
딕셔너리 형태로 결과 받기 (DictCursor)
기본 cursor는 결과를 튜플(tuple)로 줘요. 그런데 키-값으로 다루고 싶을 땐 DictCursor를 사용하면 딕셔너리로 결과를 받을 수 있어요.
cursor = conn.cursor(pymysql.cursors.DictCursor)
sql = "SELECT * FROM dept;"
cursor.execute(sql)
rows = cursor.fetchall()
for row in rows:
print(row['deptno'], row['dname'], row['loc']) # 딕셔너리 접근 가능
💡 데이터 분석할 땐 DictCursor가 진리!
딕셔너리 형태로 받아두면 pandas
와 같은 라이브러리로 전환할 때도 편하답니다.
SQL 쿼리 → 딕셔너리 → DataFrame 변환까지 수월하게 이어질 수 있어요.
다음 단계에서는 데이터를 단순히 조회만 하지 않고 INSERT, UPDATE, DELETE하는 방식도 배워볼게요.
DB를 직접 다룰 수 있게 되면, 정말 "파이썬으로 뭐든 다 된다"는 말이 실감날 거예요!
5. INSERT, UPDATE, DELETE 처리와 commit 필수 개념 📝
데이터베이스는 단순히 조회만 하는 도구가 아니죠.
실제 개발에서는 데이터를 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 기능이 훨씬 더 많이 쓰여요.
이런 명령은 execute()
로 실행한 뒤 반드시 commit()까지 해야 DB에 반영된다는 점! 꼭 기억하세요.
(안 그러면 쿼리는 실행돼도 DB에는 아무 일도 안 생긴 것처럼 보여요 😅)
INSERT 예제
sql = "INSERT INTO dept VALUES (%s, %s, %s)"
data = (50, '데이터팀', '서울')
cursor = conn.cursor()
cursor.execute(sql, data)
conn.commit()
UPDATE 예제
sql = "UPDATE dept SET dname=%s, loc=%s WHERE deptno=%s"
data = ('AI연구소', '판교', 50)
cursor.execute(sql, data)
conn.commit()
DELETE 예제
sql = "DELETE FROM dept WHERE deptno=%s"
data = (50,)
cursor.execute(sql, data)
conn.commit()
🚨 commit() 안 하면 무효!
데이터를 조작한 후 commit()을 호출해야 실제로 DB에 저장됩니다.
안 하면 임시 저장 상태로 끝나버려요.
다행히도 PyMySQL에서는 autocommit=True
옵션을 설정하면 매번 commit하지 않아도 자동 저장되니, 편하긴 하죠.
# autocommit 옵션 사용 예시
conn = pymysql.connect(
host='localhost',
user='user',
password='pass',
db='project',
charset='utf8',
autocommit=True # 자동 커밋
)
그럼 이제 마지막으로 클래스 기반의 구조화된 DB 처리 방식,
즉 DAO (Data Access Object)
패턴을 활용한 예제로 실전 마무리를 지어볼게요!
이런 구조는 웹 개발에서도 널리 사용되고 있어요. 꼭 익혀두세요! 👨💻
6. 실전 예제: 클래스 기반 DB 접속과 DAO 패턴 🧩
이제는 한 단계 더 나아가 객체지향 방식으로 데이터베이스를 관리해볼 차례입니다.
우리가 자주 접하는 웹 애플리케이션이나 백엔드 시스템에서는 보통 DAO 패턴을 활용해 DB를 다루는데요,
이 구조는 DB 접속, 쿼리 실행, 결과 처리를 하나의 클래스로 깔끔하게 분리할 수 있어서 유지보수도 편하고, 확장성도 좋아요.
📁 db_connection.py
import pymysql
class DBConnection:
@classmethod
def get_db(cls):
return pymysql.connect(
host='localhost',
user='bit',
password='bit',
db='project',
charset='utf8',
autocommit=True
)
📁 dept_dao.py
from db_connection import DBConnection
class DeptDao:
def get_depts(self):
conn = DBConnection.get_db()
cursor = conn.cursor()
cursor.execute("SELECT * FROM dept")
rows = cursor.fetchall()
conn.close()
result = []
for row in rows:
result.append({'deptno': row[0], 'dname': row[1], 'loc': row[2]})
return result
def insert_dept(self, deptno, dname, loc):
conn = DBConnection.get_db()
cursor = conn.cursor()
sql = "INSERT INTO dept VALUES (%s, %s, %s)"
cursor.execute(sql, (deptno, dname, loc))
conn.close()
return f"INSERT 완료: {deptno}"
def update_dept(self, deptno, dname, loc):
conn = DBConnection.get_db()
cursor = conn.cursor()
sql = "UPDATE dept SET dname=%s, loc=%s WHERE deptno=%s"
cursor.execute(sql, (dname, loc, deptno))
conn.close()
def delete_dept(self, deptno):
conn = DBConnection.get_db()
cursor = conn.cursor()
sql = "DELETE FROM dept WHERE deptno=%s"
cursor.execute(sql, (deptno,))
conn.close()
📁 실행 파일 (main.py)
from dept_dao import DeptDao
def display_menu():
print("1. 전체 조회\n2. 부서 등록\n3. 부서 수정\n4. 부서 삭제\n5. 종료")
return input("메뉴 번호 선택 >>> ")
def main():
dao = DeptDao()
while True:
choice = display_menu()
if choice == '1':
print(dao.get_depts())
elif choice == '2':
deptno = int(input("부서번호: "))
dname = input("부서명: ")
loc = input("지역: ")
print(dao.insert_dept(deptno, dname, loc))
elif choice == '3':
deptno = int(input("수정할 부서번호: "))
dname = input("새 부서명: ")
loc = input("새 지역: ")
dao.update_dept(deptno, dname, loc)
elif choice == '4':
deptno = int(input("삭제할 부서번호: "))
dao.delete_dept(deptno)
elif choice == '5':
print("종료합니다.")
break
else:
print("잘못된 선택입니다.")
if __name__ == "__main__":
main()
✅ DAO 패턴을 사용하면 좋은 점
- 코드 재사용성과 유지보수성이 뛰어남
- DB 처리 로직이 메인 로직과 분리돼 구조가 깔끔함
- 테스트 및 확장이 쉬움 (Mock 처리도 가능)
이제 여러분도 파이썬으로 MySQL을 자유롭게 다룰 수 있게 되셨을 거예요!
DB 입출력을 객체지향적으로 정리하는 것까지 익히면, 어떤 프로젝트에서도 뚝딱 구현 가능한 실력이 됩니다.
이제 마지막으로 간단한 마무리와 함께 태그를 정리해드릴게요.
마무리 🎯
여기까지 따라오신 분들, 정말 수고 많으셨어요! 👏
이번 글에서는 파이썬과 MySQL을 연결해서 데이터를 조회하고 수정하는 모든 기본 흐름을 실습 위주로 정리해봤습니다.
처음에는 용어도 많고 구조도 복잡해 보일 수 있지만, 직접 코드를 쳐보고 실행해보면 생각보다 간단하다는 걸 알 수 있어요.
특히 DAO 패턴은 단순한 연습용 코드보다 훨씬 실무에서 많이 쓰이는 방식이기 때문에 꼭 익혀두시길 추천드려요.
이 구조를 알고 있으면 Flask, Django, FastAPI 같은 웹 프레임워크에서도 자연스럽게 활용할 수 있거든요.
앞으로는 이 내용을 바탕으로 웹 애플리케이션과의 연동이나 API 서버 구축으로 나아갈 수도 있습니다.
그 여정의 첫걸음을 오늘 성공적으로 마무리하신 여러분께, 진심으로 박수 보내드립니다! 👏👏
이제 여러분도 자신 있게 말할 수 있어요. “파이썬으로 MySQL 다룰 수 있습니다!”