DB - pymysql

Kjjeddยท2026๋…„ 1์›” 19์ผ

DB

๋ชฉ๋ก ๋ณด๊ธฐ
9/11
post-thumbnail

๐Ÿ pymysql์ด๋ž€?

pymysql์€ Python์—์„œ MariaDB / MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

Python ์ฝ”๋“œ์™€ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” DB ๋“œ๋ผ์ด๋ฒ„๋‹ค.


๐Ÿง  DB ๋“œ๋ผ์ด๋ฒ„์˜ ์—ญํ• 

ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • Python โ†’ Python ๋ฌธ๋ฒ•
  • MariaDB/MySQL โ†’ SQL

์ด ๋‘˜์€ ์ง์ ‘ ๋Œ€ํ™”ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์— ํ†ต์—ญ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

[ Python ์ฝ”๋“œ ]
      โ”‚
      โ”‚  (DB ๋“œ๋ผ์ด๋ฒ„)
      โ–ผ
[ pymysql ]
      โ”‚
      โ–ผ
[ MariaDB / MySQL ]
  

pymysql์€ SQL์„ DB๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•˜๊ณ ,
DB์˜ ์‘๋‹ต์„ ๋‹ค์‹œ Python์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ™˜ํ•œ๋‹ค.


โ“ ์™œ ํ”„๋กœ๊ทธ๋žจ์—์„œ DB๋ฅผ ์กฐ์ž‘ํ•ด์•ผ ํ• ๊นŒ?

Workbench๋‚˜ DataGrip์—์„œ๋„ SQL์€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ์‚ฌ๋žŒ์ด ์ง์ ‘ SQL์„ ์น˜์ง€ ์•Š๋Š”๋‹ค.

  • ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ ํด๋ฆญ โ†’ INSERT ์‹คํ–‰
  • ๋กœ๊ทธ์ธ ์š”์ฒญ โ†’ SELECT ์‹คํ–‰
  • ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ โ†’ INSERT ์‹คํ–‰

์ด ๋ชจ๋“  SQL์„ Python ์ฝ”๋“œ๊ฐ€ ๋Œ€์‹  ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ๊ฐ€ ๋ฐ”๋กœ pymysql์ด๋‹ค.


๐Ÿš€ ๋จผ์ € ์‹คํ–‰ํ•ด๋ณด๊ธฐ

1๏ธโƒฃ ์„ค์น˜

pip install pymysql

์„ค์น˜ ํ™•์ธ

pip show pymysql

2๏ธโƒฃ DB ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

Python ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
์—ฐ๊ฒฐ ์ •๋ณด๋Š” ๋ณธ์ธ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ •.

import pymysql

conn = pymysql.connect(
    host="์„œ๋ฒ„์ฃผ์†Œ",
    user="์‚ฌ์šฉ์ž๋ช…",
    password="๋น„๋ฐ€๋ฒˆํ˜ธ",
    db="๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ช…",
    charset="utf8mb4"
)

print("์—ฐ๊ฒฐ ์„ฑ๊ณต!")
conn.close()

"์—ฐ๊ฒฐ ์„ฑ๊ณต!"์ด ์ถœ๋ ฅ๋˜๋ฉด DB์™€ ํ†ต์‹ ์ด ์—ด๋ฆฐ ์ƒํƒœ๋‹ค.


๐Ÿ” ์—ฐ๊ฒฐ ์ •๋ณด ๋ถ„๋ฆฌ (์ค‘์š”)

๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฝ”๋“œ์— ์ง์ ‘ ์“ฐ๋Š” ๊ฑด ์‚ฌ๊ณ  ์œ ๋ฐœ์ด๋‹ค.

๋ฐ˜๋“œ์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

import os
import pymysql

conn = pymysql.connect(
    host=os.getenv("DB_HOST"),
    user=os.getenv("DB_USER"),
    password=os.getenv("DB_PASSWORD"),
    db=os.getenv("DB_NAME"),
    charset="utf8mb4"
)
  • .env ํŒŒ์ผ ์‚ฌ์šฉ
  • .gitignore์— ์ถ”๊ฐ€

๐Ÿงท Cursor๋ž€?

DB์— ์—ฐ๊ฒฐํ–ˆ๋‹ค๊ณ  ๋ฐ”๋กœ SQL์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. cursor๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๐Ÿ“Œ cursor์˜ ๊ฐœ๋…

cursor๋Š” ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋‹ค.

์ฟผ๋ฆฌ ๊ฒฐ๊ณผ
------------------
[1] jay, 25   โ† cursor
[2] ์ฒ ์ˆ˜, 30
[3] ์˜ํฌ, 28
  

cursor๋Š” ํ•œ ์ค„์”ฉ ์ด๋™ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.
fetchone()์„ ํ˜ธ์ถœํ•˜๋ฉด ํ˜„์žฌ ํ–‰์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‹ค์Œ ํ–‰์œผ๋กœ ์ด๋™ํ•œ๋‹ค.


๐Ÿ“ฅ fetch ๋ฉ”์„œ๋“œ ๋น„๊ต

๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’ ์‚ฌ์šฉ ์‹œ์ 
fetchone() ํ•œ ํ–‰ ๊ฒฐ๊ณผ๊ฐ€ 1๊ฑด์ผ ๋•Œ
fetchall() ๋ชจ๋“  ํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฑด์ผ ๋•Œ
fetchmany(n) n๊ฐœ ํ–‰ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ์ฒ˜๋ฆฌ

๐Ÿ”„ pymysql ์ „์ฒด ํ๋ฆ„

1. connect   โ†’ DB ์—ฐ๊ฒฐ
2. cursor    โ†’ ์ปค์„œ ์ƒ์„ฑ
3. execute   โ†’ SQL ์‹คํ–‰
4. fetch     โ†’ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ
5. close     โ†’ ์ปค์„œ ์ข…๋ฃŒ
6. close     โ†’ ์—ฐ๊ฒฐ ์ข…๋ฃŒ
  

๐Ÿ“ฆ ์ „์ฒด ์˜ˆ์ œ

import pymysql

# 1. DB ์—ฐ๊ฒฐ
conn = pymysql.connect(
    host='์„œ๋ฒ„์ฃผ์†Œ',
    user='์‚ฌ์šฉ์ž๋ช…',
    password='๋น„๋ฐ€๋ฒˆํ˜ธ',
    db='๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ช…',
    charset='utf8mb4'
)

# 2. ์ปค์„œ ์ƒ์„ฑ
cursor = conn.cursor()

# 3. SQL ์‹คํ–‰
cursor.execute("SELECT * FROM users")

# 4. ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ
rows = cursor.fetchall()
for row in rows:
    print(row)

# 5. ์ข…๋ฃŒ (์ปค์„œ โ†’ ์—ฐ๊ฒฐ ์ˆœ์„œ)
cursor.close()
conn.close()

๐Ÿ”ฅ ํ•ต์‹ฌ ์š”์•ฝ

  • pymysql์€ Python โ†” MySQL ํ†ต์—ญ์‚ฌ
  • DB ๋“œ๋ผ์ด๋ฒ„ ์—†์ด๋Š” DB ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • cursor๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋ฐ˜๋“œ์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌ
profile
Gongbuhaja

0๊ฐœ์˜ ๋Œ“๊ธ€