DB - pymysql: INSERT/UPDATE/DELETE

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

DB

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

๐Ÿงฑ Python์—์„œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝํ•˜๊ธฐ (INSERT / UPDATE / DELETE)

์ง€๊ธˆ๊นŒ์ง€ SELECT๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ–ˆ๋‹ค๋ฉด,
์ด์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ๋ฐ”๊พธ๋Š” ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.


โœ๏ธ INSERT, UPDATE, DELETE๋ž€?

SQL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ช…๋ น์–ด๋‹ค.

๋ช…๋ น์–ด ์˜๋ฏธ ํ•˜๋Š” ์ผ
INSERT ์‚ฝ์ž… ์ƒˆ๋กœ์šด ํ–‰ ์ถ”๊ฐ€
UPDATE ๊ฐฑ์‹  ๊ธฐ์กด ํ–‰ ์ˆ˜์ •
DELETE ์‚ญ์ œ ๊ธฐ์กด ํ–‰ ์ œ๊ฑฐ

SELECT๋Š” ์ฝ๊ธฐ(Read)๋งŒ ํ•˜์ง€๋งŒ,
์ด ์„ธ ๋ช…๋ น์–ด๋Š” ํ…Œ์ด๋ธ” ์ž์ฒด๋ฅผ ๋ฐ”๊พผ๋‹ค.

๐Ÿ“˜ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

SELECT  โ†’ ์ฑ…์„ ์ฝ๊ธฐ
INSERT  โ†’ ์ƒˆ๋กœ์šด ๋ฌธ์žฅ ์“ฐ๊ธฐ
UPDATE  โ†’ ๊ธฐ์กด ๋ฌธ์žฅ ์ˆ˜์ •
DELETE  โ†’ ๋ฌธ์žฅ ์ง€์šฐ๊ธฐ
๐Ÿง  CRUD ๊ฐœ๋…

CREATE โ†’ INSERT
READ โ†’ SELECT
UPDATE โ†’ UPDATE
DELETE โ†’ DELETE

๐Ÿงช ๋จผ์ € SQL๋กœ ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ณด๊ธฐ

Python ์ฝ”๋“œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋ฐ˜๋“œ์‹œ SQL์„ ์ง์ ‘ ์‹คํ–‰ํ•ด๋ณด๊ณ  ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ“ฆ ์‹ค์Šต์šฉ ํ…Œ์ด๋ธ” ์ค€๋น„

CREATE TABLE IF NOT EXISTS practice_users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100),
    age INT
);

INSERT INTO practice_users (name, email, age)
VALUES ('์ฒ ์ˆ˜', 'chulsoo@example.com', 25);

INSERT INTO practice_users (name, email, age)
VALUES ('์˜ํฌ', 'younghee@example.com', 23);

โž• INSERT ์‹ค์Šต

INSERT INTO practice_users (name, email, age)
VALUES ('์งฑ๊ตฌ', 'jjanggu@example.com', 5);

SELECT * FROM practice_users;

โœ๏ธ UPDATE ์‹ค์Šต

UPDATE practice_users
SET age = 6
WHERE name = '์งฑ๊ตฌ';

SELECT * FROM practice_users
WHERE name = '์งฑ๊ตฌ';

๐Ÿ—‘๏ธ DELETE ์‹ค์Šต

DELETE FROM practice_users
WHERE name = '์งฑ๊ตฌ';

SELECT * FROM practice_users;
โš ๏ธ ์ง„์งœ ์ค‘์š”ํ•œ ๊ฒฝ๊ณ 

UPDATE / DELETE์—์„œ
WHERE ์ ˆ์ด ์—†์œผ๋ฉด ์ „๋ถ€ ๋‚ ์•„๊ฐ„๋‹ค.

์‹คํ–‰ ์ „์— ์กฐ๊ฑด์„ ์„ธ ๋ฒˆ ํ™•์ธํ•˜์ž.

๐Ÿ Python์—์„œ INSERT ํ•˜๊ธฐ

์ด์ œ Python ์ฝ”๋“œ์—์„œ SQL์„ ์‹คํ–‰ํ•œ๋‹ค.
Python์€ ์ง์ ‘ DB๋ฅผ ๋งŒ์งˆ ์ˆ˜ ์—†๊ณ , pymysql์ด ์ค‘๊ฐ„ ํ†ต์—ญ์„ ํ•œ๋‹ค.

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

๐Ÿ“Œ ๊ธฐ๋ณธ INSERT ์ฝ”๋“œ

import pymysql

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

cursor = conn.cursor()

sql = "INSERT INTO users (name, email, age) VALUES (%s, %s, %s)"
cursor.execute(sql, ('์งฑ๊ตฌ', 'jjanggu@example.com', 5))

conn.commit()

print("์ƒ์„ฑ๋œ ID:", cursor.lastrowid)

cursor.close()
conn.close()

๐Ÿ” ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ์ค‘์š”ํ•œ ์ด์œ 

โŒ ์œ„ํ—˜ํ•œ ๋ฐฉ์‹
"INSERT INTO users VALUES ('" + name + "')"

โœ… ์•ˆ์ „ํ•œ ๋ฐฉ์‹
"INSERT INTO users VALUES (%s)", (name,)

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด:

  • SQL Injection ๊ณต๊ฒฉ ์ฐจ๋‹จ
  • ์ž๋™ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ
  • ์ฟผ๋ฆฌ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

๐Ÿ’พ commit()์˜ ์˜๋ฏธ

execute()  โ†’ DB์— ์š”์ฒญ๋งŒ ๋ณด๋ƒ„
commit()   โ†’ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ • ์ €์žฅ
โ— commit() ์•ˆ ํ•˜๋ฉด?

INSERT / UPDATE / DELETE๋Š”
commit() ์ „๊นŒ์ง€ ์ž„์‹œ ์ƒํƒœ๋‹ค.

์—ฐ๊ฒฐ์„ ๋Š์œผ๋ฉด ์ „๋ถ€ ์ทจ์†Œ๋œ๋‹ค.

๐Ÿ†” lastrowid

AUTO_INCREMENT ์ปฌ๋Ÿผ์ด ์žˆ์„ ๋•Œ,
๋ฐฉ๊ธˆ INSERTํ•œ ํ–‰์˜ id๋ฅผ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

print(cursor.lastrowid)

โœ๏ธ Python์—์„œ UPDATE

sql = "UPDATE users SET age = %s WHERE name = %s"
cursor.execute(sql, (6, '์งฑ๊ตฌ'))

conn.commit()

print("์ˆ˜์ •๋œ ํ–‰ ์ˆ˜:", cursor.rowcount)

๐Ÿ“Š rowcount

๊ฐ’ ์˜๋ฏธ
0 ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰ ์—†์Œ
1 1ํ–‰ ์ˆ˜์ •๋จ

๐Ÿ—‘๏ธ Python์—์„œ DELETE

sql = "DELETE FROM users WHERE name = %s"
cursor.execute(sql, ('์งฑ๊ตฌ',))

conn.commit()

print("์‚ญ์ œ๋œ ํ–‰ ์ˆ˜:", cursor.rowcount)
๐Ÿ’ก ํŠœํ”Œ ์ฃผ์˜

('์งฑ๊ตฌ') โ†’ ๋ฌธ์ž์—ด
('์งฑ๊ตฌ',) โ†’ ํŠœํ”Œ (์ •๋‹ต)

โš ๏ธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํŒจํ„ด

DB ์ž‘์—…์€ ํ•ญ์ƒ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
๋„คํŠธ์›Œํฌ ๋ฌธ์ œ, ์ค‘๋ณต ํ‚ค, ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ, ์„œ๋ฒ„ ๋‹ค์šดโ€ฆ
๊ทธ๋ž˜์„œ INSERT / UPDATE / DELETE์—๋Š” ๋ฐ˜๋“œ์‹œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.


๐Ÿง  ์™œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

[์ •์ƒ ํ๋ฆ„]
Python โ†’ SQL ์‹คํ–‰ โ†’ commit โ†’ ์ €์žฅ ์™„๋ฃŒ

[์—๋Ÿฌ ๋ฐœ์ƒ]
Python โ†’ SQL ์‹คํ–‰ โ†’ โŒ ์—๋Ÿฌ โ†’ ๋ฐ์ดํ„ฐ ์ƒํƒœ ๋ถˆ์•ˆ์ •

์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋Š”๋ฐ commit์ด ๋˜๋ฉด ์•ˆ ๋œ๋‹ค.
์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค๋ฉด ๋ชจ๋“  ๋ณ€๊ฒฝ์„ ๋˜๋Œ๋ ค์•ผ ํ•œ๋‹ค.

์€ํ–‰ ์†ก๊ธˆ ๋น„์œ 

1๏ธโƒฃ ๋‚ด ๊ณ„์ขŒ์—์„œ ๋ˆ ์ถœ๊ธˆ
2๏ธโƒฃ ์ƒ๋Œ€ ๊ณ„์ขŒ์— ์ž…๊ธˆ

โ†’ 2๏ธโƒฃ์—์„œ ์‹คํŒจํ•˜๋ฉด?
โ†’ 1๏ธโƒฃ๋„ ์ทจ์†Œํ•ด์•ผ ํ•จ

์ด๊ฒŒ ๋ฐ”๋กœ rollback()


๐Ÿงฉ try / except / finally ๊ธฐ๋ณธ ๊ตฌ์กฐ

try:
    ์ •์ƒ ํ๋ฆ„ (SQL ์‹คํ–‰)
except:
    ์—๋Ÿฌ ์ฒ˜๋ฆฌ (rollback)
finally:
    ์ž์› ์ •๋ฆฌ (close)

์ด ์„ธ ๋ธ”๋ก์€ ์—ญํ• ์ด ๋ช…ํ™•ํžˆ ๋‹ค๋ฅด๋‹ค.

๋ธ”๋ก ์—ญํ• 
try ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ
except ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„ ๋•Œ ์‹คํ–‰ํ•  ์ฝ”๋“œ
finally ์—๋Ÿฌ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋ฐ˜๋“œ์‹œ ์‹คํ–‰

๐Ÿงช INSERT + ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์˜ˆ์ œ

import pymysql

conn = None

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

    # 2๏ธโƒฃ SQL ์‹คํ–‰
    sql = "INSERT INTO users (name, email, age) VALUES (%s, %s, %s)"
    cursor.execute(sql, ('jeff', 'jeff@example.com', 30))

    # 3๏ธโƒฃ ์ •์ƒ์ผ ๋•Œ๋งŒ commit
    conn.commit()
    print("๋ฐ์ดํ„ฐ ์ €์žฅ ์™„๋ฃŒ")

except pymysql.Error as e:
    # 4๏ธโƒฃ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ rollback
    print(f"์—๋Ÿฌ ๋ฐœ์ƒ: {e}")
    if conn:
        conn.rollback()

finally:
    # 5๏ธโƒฃ ์ž์› ์ •๋ฆฌ
    if conn:
        conn.close()

๐Ÿ” commit() vs rollback()

๋ฉ”์„œ๋“œ ์˜๋ฏธ
commit() ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ •
rollback() commit ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆผ

<์›์น™ ํ•˜๋‚˜๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค.

์„ฑ๊ณต โ†’ commit()
์‹คํŒจ โ†’ rollback()

๐Ÿงน finally ๋ธ”๋ก์˜ ์ค‘์š”์„ฑ

DB ์—ฐ๊ฒฐ๊ณผ ์ปค์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ซ์•„์•ผ ํ•˜๋Š” ์ž์›์ด๋‹ค.
์—๋Ÿฌ๊ฐ€ ๋‚˜๋“  ์•ˆ ๋‚˜๋“ , ์—ด์—ˆ์œผ๋ฉด ๋‹ซ์•„์•ผ ํ•œ๋‹ค.

finally:
    if cursor:
        cursor.close()
    if conn:
        conn.close()

์ด๊ฑธ ์•ˆ ํ•˜๋ฉด?

  • ์—ฐ๊ฒฐ ๋ˆ„์ˆ˜
  • ์ปค๋„ฅ์…˜ ํ’€ ๊ณ ๊ฐˆ
  • ์„œ๋ฒ„ ํ„ฐ์ง

โœจ with ๋ฌธ์œผ๋กœ ๋” ๊น”๋”ํ•˜๊ฒŒ

Python์˜ with ๋ฌธ์€ ์ž์› ๊ด€๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ค€๋‹ค.

import pymysql

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

with conn:
    with conn.cursor() as cursor:
        sql = "INSERT INTO users (name, email, age) VALUES (%s, %s, %s)"
        cursor.execute(sql, ('์ฒ ์ˆ˜', 'chulsoo@example.com', 25))

    conn.commit()

์ด ๊ตฌ์กฐ์—์„œ ์ค‘์š”ํ•œ ์ 

  • with conn โ†’ ๋ธ”๋ก ์ข…๋ฃŒ ์‹œ ์ž๋™ close
  • with cursor โ†’ cursor.close() ์ž๋™
  • ์‹ค์ˆ˜ํ•  ์—ฌ์ง€๊ฐ€ ์ค„์–ด๋“ฆ

๐Ÿง  ์‹ค๋ฌด์—์„œ ๊ถŒ์žฅ๋˜๋Š” ํŒจํ„ด

try:
    with conn:
        with conn.cursor() as cursor:
            SQL ์‹คํ–‰
        conn.commit()
except:
    conn.rollback()

DB ์ž‘์—…์€ ํ•ญ์ƒ ์ด ํŒจํ„ด์œผ๋กœ ๊ฐ์‹ธ๋Š” ๊ฒŒ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.


๐Ÿ“Œ ์—ฌ๊ธฐ๊นŒ์ง€

๊ฐœ๋… ํ•ต์‹ฌ ์š”์•ฝ
INSERT / UPDATE / DELETE ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ
commit() ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ •
rollback() ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ทจ์†Œ
try / except ์—๋Ÿฌ ์ œ์–ด
finally / with ์ž์› ์ •๋ฆฌ
profile
Gongbuhaja

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