[TIL] 내일배움캠프 66일차_[Python] DB에 데이터 저장 - MySQL
👀Today I Learn
pymysql 설치하기
- Python에서 MySQL 데이터베이스와 상호 작용할 수 있도록 도와주는 라이브러리
-
MySQL 서버와 연결하고, 데이터를 삽입/조회/수정/삭제하는 기능을 제공
pip install pymysql
MySQL에 연결하기
import pymysql
# MySQL 연결
conn = pymysql.connect(
host='localhost', # MySQL 서버 주소
user='root', # MySQL 사용자 이름
password='1234', # MySQL 비밀번호
db='testdb', # 사용할 데이터베이스
charset='utf8mb4', # 한글 지원
autocommit=True # 자동 커밋 설정
)
print("MySQL 연결 성공!")
conn.close()
기능 살펴보기
기능 | SQL 문 | pymysql 코드 |
---|---|---|
데이터베이스 생성 | CREATE DATABASE db_name; |
cursor.execute("CREATE DATABASE db_name") |
테이블 생성 | CREATE TABLE table_name (...); |
cursor.execute("CREATE TABLE ...") |
데이터 삽입 | INSERT INTO table VALUES (...); |
cursor.execute("INSERT INTO ...") |
여러 개 데이터 삽입 | INSERT INTO table VALUES (...), (...); |
cursor.executemany("INSERT INTO ...") |
데이터 조회 | SELECT * FROM table; |
cursor.fetchall() |
데이터 수정 | UPDATE table SET col=value WHERE ...; |
cursor.execute("UPDATE ...") |
데이터 삭제 | DELETE FROM table WHERE ...; |
cursor.execute("DELETE ...") |
-
이렇게 사용하면 됨!
try: with conn.cursor() as cursor: sql = "여기에다가 위의 코드를 넣어서 사용하면 됨" cursor.execute(sql) finally: conn.close()
⚠️주의할 점!
- MySQL 서버가 실행 중인지 확인
- MySQL 서비스 시작 후 실행해야 합니다.
- 윈도우: net start mysql
- 리눅스/맥: sudo systemctl start mysql
-
SQL 인젝션 방지를 위해 execute()에 직접 변수를 넣지 말 것
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", (name, age))
-
❌ 이렇게 하면 안됨:
cursor.execute(f"INSERT INTO users (name, age) VALUES ('{name}', {age})") # SQL Injection 위험
-
자동 커밋(autocommit=True)을 사용하지 않는다면 conn.commit()을 해줘야 함
conn.commit()
-
연결을 닫아야 함
- 사용 후 반드시 conn.close()를 호출하여 리소스를 해제할 것
conn.close()
MySQL 사용해보기
1. 데이터베이스 생성하기
import pymysql
# MySQL 서버에 연결 (데이터베이스 없이 연결)
conn = pymysql.connect(
host='localhost',
user='root',
password='1234',
charset='utf8mb4',
autocommit=True # 자동 커밋 설정
)
try:
with conn.cursor() as cursor:
# 데이터베이스 생성
sql = "CREATE DATABASE IF NOT EXISTS kobis CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
cursor.execute(sql)
finally:
conn.close() # 연결 종료
-
실행하고 DB를 확인해보면 ‘kobis’ 데이터베이스가 생겼음!
- 테이블은 따로 넣어준게 없기 때문에 텅텅 비어있는 DB가 생성되어 있음
- 테이블을 생성해보자!
2. 테이블 생성하기
import pymysql
# MySQL 'kobis' 데이터베이스에 연결
conn = pymysql.connect(
host='localhost',
user='root',
password='1234',
db='kobis',
charset='utf8mb4',
autocommit=True
)
try:
with conn.cursor() as cursor:
# 테이블 생성 SQL
sql = """
CREATE TABLE IF NOT EXISTS results (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
score FLOAT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
"""
cursor.execute(sql)
finally:
conn.close()
-
실행하고 다시 DB에 가보면 이렇게 ‘results’라는 테이블이 생성된 걸 확인할 수 있음!
-
근데 DB와 table 생성을 한줄에 코딩할 수는 없을까?🤔
- 당연히, 가능! 위의 두 코드를 합쳐주면 된다!
3. DB와 테이블 생성하기
import pymysql
# MySQL 서버 연결 및 DB 생성
conn = pymysql.connect(
host='localhost',
user='root',
password='1234',
charset='utf8mb4',
autocommit=True
)
try:
with conn.cursor() as cursor:
# 데이터베이스 및 테이블 생성
cursor.execute("CREATE DATABASE IF NOT EXISTS kobis1 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;")
cursor.execute("USE kobis1;")
cursor.execute("""
CREATE TABLE IF NOT EXISTS results1 (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
score FLOAT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
""")
finally:
conn.close()
-
이렇게 하면 한번의 코드 실행으로 DB와 Table을 생성할 수 있음!
4. DB 삭제
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='1234',
charset='utf8mb4',
autocommit=True
)
try:
with conn.cursor() as cursor:
cursor.execute("DROP DATABASE IF EXISTS kobis1;")
finally:
conn.close()
예제
- Python에서 학생의 시험 점수 계산을 수행한 후, 그 결과값을 MySQL 테이블에 저장
import pymysql
# MySQL 서버 연결 및 DB 생성
conn = pymysql.connect(
host='localhost',
user='root',
password='1234',
charset='utf8mb4',
autocommit=True
)
try:
with conn.cursor() as cursor:
# 1. 데이터베이스 및 테이블 생성
cursor.execute("CREATE DATABASE IF NOT EXISTS kobis CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;")
cursor.execute("USE kobis;")
cursor.execute("""
CREATE TABLE IF NOT EXISTS results (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
score FLOAT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
""")
# 2. 학생들의 점수 입력
students = [
("Bob", [78, 82, 80]),
("Charlie", [95, 92, 88]),
("David", [60, 70, 65])
]
# 3. 평균 점수 계산 후 MySQL에 저장
sql = "INSERT INTO results (name, score) VALUES (%s, %s)"
values = [(name, sum(scores)/len(scores)) for name, scores in students]
cursor.executemany(sql, values)
finally:
conn.close()
💡Today I Thought
오늘의 체크리스트
- 알고리즘 코드카타 291-295
- SQL 코드카타 89-90
- LLM 특강듣기
- LLM 메인과제 => 는 하다가 말았음..
- TIL 작성
- WIL 작성
회고
오늘.. 왜이렇게 공부가 안되는건지..ㅎㅎ 눈이 와서 그런가☃️ 내일..이랑 모레의 나에게 할일 토스…
댓글남기기