Search

Python x MySQL 연동

Python x MySQL 연동

1.
pymysql λͺ¨λ“ˆ μ„€μΉ˜ 및 μ‚¬μš©
2.
데이터 μ†ŒμŠ€λ‘œ 접속
β€’
데이터 μ†ŒμŠ€ : DB 접속 정보
β—¦
계정
β—¦
λΉ„λ°€λ²ˆν˜Έ
β—¦
호슀트
β—¦
μŠ€ν‚€λ§ˆ(λ°μ΄ν„°λ² μ΄μŠ€)
3.
데이터 베이슀 접속
4.
μ»€μ„œ 생성
5.
쑰회 및 μ‘°μž‘ ν•¨μˆ˜ μ‚¬μš©
β€’
쑰회 ν•¨μˆ˜ : fetchall(), fetchone()
β€’
μ‘°μž‘ ν•¨μˆ˜ : excute() - 등둝,μˆ˜μ •,μ‚­μ œ

pymysql λͺ¨λ“ˆ μ„€μΉ˜ 및 μ‚¬μš©

β€’
pymysql λͺ¨λ“ˆ
β€’
pymysql λͺ¨λ“ˆ μ„€μΉ˜
β€’
pymysql λͺ¨λ“ˆ μ‚¬μš©

pymysql λͺ¨λ“ˆ

Pythonμ—μ„œ MySQL λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜κΈ° μœ„ν•œ λͺ¨λ“ˆ
pymysql λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ Python μ½”λ“œμ—μ„œ MySQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 λ‹€μŒκ³Ό 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
1.
μ—°κ²°: MySQL λ°μ΄ν„°λ² μ΄μŠ€μ— μ—°κ²°ν•©λ‹ˆλ‹€.
2.
쿼리 μ‹€ν–‰: SQL 쿼리λ₯Ό μ‹€ν–‰ν•˜μ—¬ 데이터λ₯Ό 쑰회, μΆ”κ°€, μˆ˜μ • λ˜λŠ” μ‚­μ œν•©λ‹ˆλ‹€.
3.
κ²°κ³Ό 처리: 쿼리 μ‹€ν–‰ κ²°κ³Όλ₯Ό λ°›μ•„μ™€μ„œ Python μ½”λ“œμ—μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
4.
μ—°κ²° μ’…λ£Œ: λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 연결을 μ’…λ£Œν•©λ‹ˆλ‹€.

pymysql λͺ¨λ“ˆ μ„€μΉ˜

pip install pymysql
Bash
볡사
MySQL μ„œλ²„μ™€μ˜ 톡신을 λ³΄μ•ˆν•˜κΈ° μœ„ν•΄ TLS/SSL을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄, cryptography λΌμ΄λΈŒλŸ¬λ¦¬λ„ μ„€μΉ˜ν•©λ‹ˆλ‹€.
pip install cryptography
Bash
볡사

pymysql λͺ¨λ“ˆ μ‚¬μš©

import pymysql
Bash
볡사

pymysql 을 μ‚¬μš©ν•˜μ΄ μœ„ν•œ κΈ°λ³Έ μ½”λ“œ

import pymysql # MySQL λ°μ΄ν„°λ² μ΄μŠ€μ— μ—°κ²° connection = pymysql.connect(host='호슀트λͺ…', user='μ‚¬μš©μžλͺ…', password='λΉ„λ°€λ²ˆν˜Έ', database='λ°μ΄ν„°λ² μ΄μŠ€λͺ…', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) try: with connection.cursor() as cursor: # 쿼리 μ‹€ν–‰ sql = "SELECT * FROM ν…Œμ΄λΈ”λͺ…" cursor.execute(sql) # κ²°κ³Ό κ°€μ Έμ˜€κΈ° result = cursor.fetchall() for row in result: print(row) finally: # μ—°κ²° μ’…λ£Œ connection.close()
Python
볡사

데이터 μ†ŒμŠ€λ‘œ 접속

데이터 μ†ŒμŠ€ : DB 접속 정보

β€’
계정
β€’
λΉ„λ°€λ²ˆν˜Έ
β€’
호슀트
β€’
μŠ€ν‚€λ§ˆ(λ°μ΄ν„°λ² μ΄μŠ€)
속성
κ°’
호슀트
127.0.0.1
μ‚¬μš©μž
aloha
λΉ„λ°€λ²ˆν˜Έ
123456
λ°μ΄ν„°λ² μ΄μŠ€
aloha
ν˜ΈμŠ€νŠΈλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ˜ ip μ£Όμ†Œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. ν˜„μž¬ PC 둜 μ ‘μ†ν•œλ‹€λ©΄, 127.0.0.1 λ˜λŠ” localhost 둜 μ§€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€. λ§Œμ•½ λ‹€λ₯Έ DB μ„œλ²„κ°€ λ‹€λ₯Έ 컴퓨터라면 ν•΄λ‹Ή DBμ„œλ²„μ˜ IP μ£Όμ†Œλ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.
μ‚¬μš©μžλŠ” μ—¬κΈ°μ„œλŠ” aloha 라고 μƒμ„±ν•˜κ³  μ ‘κ·Όν•©λ‹ˆλ‹€. λΉ„λ°€λ²ˆν˜Έλ„ 123456 으둜 μ§€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 데이터 μ†ŒμŠ€ (접속정보)λŠ” 미리 μƒμ„±λœ κ³„μ •μ˜ 정보λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€. database(μŠ€ν‚€λ§ˆ)λŠ” μ—¬κΈ°μ„œλŠ” aloha 라고 μƒμ„±ν•˜κ³  μ‚¬μš©ν•©λ‹ˆλ‹€.

데이터 베이슀 접속

pymysql λͺ¨λ“ˆμ˜ connect ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ DB에 μ ‘μ†ν•©λ‹ˆλ‹€.
# MySQL μ„œλ²„μ— 접속 conn = pymysql.connect( host='127.0.0.1', user='aloha', password='123456', database='aloha', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor )
Python
볡사
pymysql.connect( λ°μ΄ν„°μ†ŒμŠ€ ) ν˜•νƒœλ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  μ •μƒμ μœΌλ‘œ DB에 접속이 μ„±κ³΅λ˜λ©΄, μ—°κ²° 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 이 conn 객체λ₯Ό ν†΅ν•΄μ„œ μ»€μ„œλ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ»€μ„œ 생성

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 쿼리λ₯Ό μ‹€ν–‰ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό κ°€μ Έμ˜€λŠ” 데 μ‚¬μš©λ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

μ»€μ„œμ˜ μ—­ν• 

1.
쿼리 μ‹€ν–‰: μ»€μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ— SQL 쿼리λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. μΏΌλ¦¬λŠ” 데이터λ₯Ό 쑰회, μΆ”κ°€, μˆ˜μ •, μ‚­μ œν•˜λŠ” 데 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.
2.
κ²°κ³Ό κ°€μ Έμ˜€κΈ°: μ»€μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹€ν–‰λœ 쿼리의 κ²°κ³Όλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. 이 κ²°κ³ΌλŠ” ν•˜λ‚˜ μ΄μƒμ˜ λ ˆμ½”λ“œλ‘œ κ΅¬μ„±λ˜λ©°, 각 λ ˆμ½”λ“œλŠ” ν•˜λ‚˜ μ΄μƒμ˜ 열을 ν¬ν•¨ν•©λ‹ˆλ‹€.
3.
κ²°κ³Ό 처리: κ°€μ Έμ˜¨ κ²°κ³Όλ₯Ό Python μ½”λ“œμ—μ„œ μ²˜λ¦¬ν•˜κ³  μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°€μ Έμ˜¨ 데이터λ₯Ό μ‘°μž‘ν•˜κ³  뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€.
4.
νŠΈλžœμž­μ…˜ 관리: μ»€μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜κ³  μ’…λ£Œν•˜λ©°, νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 쿼리λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ˜ 일관성과 무결성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ»€μ„œ 생성

with connection.cursor() as cursor: # 쿼리 μ‹€ν–‰ sql = "SQL 쿼리" cursor.execute(sql) # κ²°κ³Ό κ°€μ Έμ˜€κΈ° result = cursor.μ‘°νšŒλ°μ‘°μž‘ν•¨μˆ˜()
Python
볡사
μœ„μ™€ 같이 μ‹€ν–‰ν•  SQL λ¬Έμž₯을 β€œλ¬Έμžμ—΄β€ 둜 μž‘μ„±ν•˜κ³ , excute(sql) ν•¨μˆ˜λ‘œ 쿼리λ₯Ό DB 에 μ‹€ν–‰ μš”μ²­ν•©λ‹ˆλ‹€. κ·Έ ν›„, 데이터 쑰회 및 μ‘°μž‘ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜λ°›μŠ΅λ‹ˆλ‹€.

쑰회 및 μ‘°μž‘ ν•¨μˆ˜ μ‚¬μš©

β€’
쑰회 ν•¨μˆ˜ : fetchall(), fetchone()
β€’
μ‘°μž‘ ν•¨μˆ˜ : excute() - 등둝,μˆ˜μ •,μ‚­μ œ

쑰회 ν•¨μˆ˜ : fetchall(), fetchone()

ν•¨μˆ˜
μ„€λͺ…
λ°˜ν™˜κ°’
fetchall()
ν˜„μž¬ μ‹€ν–‰λœ 쿼리의 λͺ¨λ“  κ²°κ³Όλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
κ²°κ³Όλ₯Ό ν¬ν•¨ν•˜λŠ” λͺ¨λ“  행을 λ°˜ν™˜
fetchone()
ν˜„μž¬ μ‹€ν–‰λœ 쿼리의 λ‹€μŒ κ²°κ³Ό ν–‰ ν•˜λ‚˜λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
λ‹€μŒ κ²°κ³Ό 행을 λ°˜ν™˜
fetchall() ν•¨μˆ˜λŠ” ν˜„μž¬ μ‹€ν–‰λœ 쿼리의 λͺ¨λ“  κ²°κ³Ό 행을 κ°€μ Έμ˜΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 쿼리의 λͺ¨λ“  κ²°κ³Όλ₯Ό κ°€μ Έμ™€μ„œ 리슀트 ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€. 각 행은 리슀트의 μ›μ†Œλ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.
fetchone() ν•¨μˆ˜λŠ” ν˜„μž¬ μ‹€ν–‰λœ 쿼리의 κ²°κ³Ό ν–‰ 쀑 λ‹€μŒ ν–‰ ν•˜λ‚˜λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ λ‹€μŒ κ²°κ³Ό 행이 λ°˜ν™˜λ©λ‹ˆλ‹€. λ§Œμ•½ 더 이상 κ²°κ³Όκ°€ μ—†μœΌλ©΄ None을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
β€’
학생 ν…Œμ΄λΈ”μ—μ„œ 데이터 λͺ©λ‘ 쑰회
# pip install pymysql # pip install cryptography import pymysql # MySQL μ„œλ²„μ— 접속 conn = pymysql.connect( host='127.0.0.1', user='joeun', password='123456', database='joeun', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) try: with conn.cursor() as cursor: sql = "SELECT * FROM 학생" cursor.execute(sql) # DB에 쿼리 μš”μ²­ students = cursor.fetchall() # κ²°κ³Ό for student in students: print( student ) except pymysql.MySQLError as e: print('MySQL μ—λŸ¬ : ', e) finally: conn.close()
Python
볡사
β€’
학생 ν…Œμ΄λΈ”μ—μ„œ 단일 ν…Œμ΄ν„° 쑰회
# pip install pymysql # pip install cryptography import pymysql # MySQL μ„œλ²„μ— 접속 conn = pymysql.connect( host='127.0.0.1', user='joeun', password='123456', database='joeun', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) try: with conn.cursor() as cursor: sql = "SELECT * FROM 학생 WHERE no = 1 " cursor.execute(sql) # DB에 쿼리 μš”μ²­ student = cursor.fetchone() # κ²°κ³Ό print( student ) except pymysql.MySQLError as e: print('MySQL μ—λŸ¬ : ', e) finally: conn.close()
Python
볡사

μ‘°μž‘ ν•¨μˆ˜ : excute() - 등둝,μˆ˜μ •,μ‚­μ œ

excute( SQL, νŒŒλΌλ―Έν„° )
νŒŒλΌλ―Έν„°
μ„€λͺ…
SQL
μ‹€ν–‰ν•  SQL μΏΌλ¦¬μž…λ‹ˆλ‹€.
νŒŒλΌλ―Έν„°
ν•„μš”μ— 따라 SQL 쿼리에 전달할 νŒŒλΌλ―Έν„°μž…λ‹ˆλ‹€. 단일 데이터 λ˜λŠ” νŠœν”Œ ν˜•νƒœλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
SQL 문에 νŒŒλΌλ―Έν„°λ₯Ό λ§€ν•‘ν•˜κΈ° μœ„ν•΄μ„œ β€˜%s’ 기호λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
μ•„λž˜μ™€ 같이 데이터 쑰회, 등둝, μˆ˜μ •, μ‚­μ œ 쿼리에 λŒ€ν•˜μ—¬ νŒŒλΌλ―Έν„°λ₯Ό λ§€ν•‘ν•˜λŠ” 경우 %s 기호λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
sql = 'SELECT * FROM 학생 WHERE no = %s'
Python
볡사
sql = " INSERT INTO 학생 (std_id, name, tel) "\ + " VALUES (%s, %s, %s) "
Python
볡사
sql = " UPDATE 학생 "\ + " SET std_id = %s "\ + " ,name = %s "\ + " ,tel = %s "\ + " ,upd_date = now() "\ + " WHERE std_id = %s "
Python
볡사
sql = " DELETE FROM 학생 "\ + " WHERE std_id = %s "
Python
볡사
μœ„μ— μž‘μ„±ν•œ SQL λ¬Έμž₯에 λŒ€ν•˜μ—¬, execute( sql, (νŒŒλΌλ―Έν„°1, νŒŒλΌλ―Έν„°2,) ) ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄,
%s κΈ°ν˜Έμ— νŒŒλΌλ―Έν„°1, 2 λ₯Ό μˆœμ„œλ₯Ό λ§žμΆ°μ„œ λ§€ν•‘ν•©λ‹ˆλ‹€.
β€’
학생 데이터 쑰회
β€’
학생 데이터 μΆ”κ°€
β€’
학생 데이터 μˆ˜μ •
β€’
학생 데이터 μ‚­μ œ

학생 데이터 쑰회

# pip install pymysql # pip install cryptography import pymysql # MySQL μ„œλ²„μ— 접속 conn = pymysql.connect( host='127.0.0.1', user='joeun', password='123456', database='joeun', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) try: with conn.cursor() as cursor: sql = "SELECT * FROM 학생 WHERE no = %s " cursor.execute(sql, 1) # DB에 쿼리 μš”μ²­ student = cursor.fetchone() # κ²°κ³Ό print( student ) except pymysql.MySQLError as e: print('MySQL μ—λŸ¬ : ', e) finally: conn.close()
Python
볡사

학생 데이터 μΆ”κ°€

import pymysql # MySQL μ„œλ²„μ— 접속 conn = pymysql.connect( host='127.0.0.1', user='joeun', password='123456', database='joeun', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) std_id = input('ν•™λ²ˆ : ') name = input('이름 : ') tel = input('μ „ν™”λ²ˆν˜Έ : ') try: # μ»€μ„œ 생성 with conn.cursor() as cursor: # 데이터 등둝 쿼리 sql = " INSERT INTO 학생 (std_id, name, tel) "\ + " VALUES (%s, %s, %s) " # + " VALUES ('B2401', '홍길동', '010-1234-1234') " # result = cursor.execute(sql) # 쿼리 μ‹€ν–‰ μš”μ²­ result = cursor.execute(sql, (std_id, name, tel)) # νŒŒλΌλ―Έν„° μ§€μ • print('{}ν–‰μ˜ 데이터 등둝 μ™„λ£Œ'.format(result)) # 변경사항 적용 conn.commit() except pymysql.MySQLError as e: print("데이터 등둝 쀑 μ—λŸ¬ λ°œμƒ : ", e) finally: conn.close()
Python
볡사

학생 데이터 μˆ˜μ •

import pymysql # MySQL μ„œλ²„μ— 접속 conn = pymysql.connect( host='127.0.0.1', user='joeun', password='123456', database='joeun', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) std_id = input('ν•™λ²ˆ : ') name = input('이름 : ') tel = input('μ „ν™”λ²ˆν˜Έ : ') try: # μ»€μ„œ 생성 with conn.cursor() as cursor: # 데이터 μˆ˜μ • 쿼리 sql = " UPDATE 학생 "\ + " SET std_id = %s "\ + " ,name = %s "\ + " ,tel = %s "\ + " ,upd_date = now() "\ + " WHERE std_id = %s " # + " VALUES ('B2401', '홍길동', '010-1234-1234') " # result = cursor.execute(sql) # 쿼리 μ‹€ν–‰ μš”μ²­ result = cursor.execute(sql, (std_id, name, tel, std_id)) # νŒŒλΌλ―Έν„° μ§€μ • print('{}ν–‰μ˜ 데이터 μˆ˜μ • μ™„λ£Œ'.format(result)) # 변경사항 적용 conn.commit() except pymysql.MySQLError as e: print("데이터 μˆ˜μ • 쀑 μ—λŸ¬ λ°œμƒ : ", e) finally: conn.close()
Python
볡사

학생 데이터 μ‚­μ œ

import pymysql # MySQL μ„œλ²„μ— 접속 conn = pymysql.connect( host='127.0.0.1', user='joeun', password='123456', database='joeun', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) std_id = input('ν•™λ²ˆ : ') try: # μ»€μ„œ 생성 with conn.cursor() as cursor: # 데이터 μ‚­μ œ 쿼리 sql = " DELETE FROM 학생 "\ + " WHERE std_id = %s " result = cursor.execute(sql, (std_id)) # νŒŒλΌλ―Έν„° μ§€μ • print('{}ν–‰μ˜ 데이터 μ‚­μ œ μ™„λ£Œ'.format(result)) # 변경사항 적용 conn.commit() except pymysql.MySQLError as e: print("데이터 μ‚­μ œ 쀑 μ—λŸ¬ λ°œμƒ : ", e) finally: conn.close()
Python
볡사