Codong's Development Diary RSS ํƒœ๊ทธ ๊ด€๋ฆฌ ๊ธ€์“ฐ๊ธฐ ๋ฐฉ๋ช…๋ก
2021-02-24 20:27:35

๐Ÿ‘‹ ๊ฐœ์š”


์ œ์ผ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณธ DB๋Š” SQLite ์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ DB๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋„ ๋ถ€๋‹ด์ด ์—†๊ณ , python์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์—ฐ๋™๋˜๋Š” DB์ด๊ธฐ๋„ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์•„์ฃผ ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์ œ์ž‘ํ•˜๊ฑฐ๋‚˜ ํ•  ๋•Œ์—๋Š” ์‚ฌ์šฉ๋ถˆ๊ฐ€ํ•  ๊ฒƒ์ด๋‹ค..


๐Ÿ•น ์‚ฌ์šฉ๋ฒ•


์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ, ๋ˆˆ์œผ๋กœ DB์˜ ์ƒ์„ฑ, ์ฝ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋‹ค.

https://sqlitebrowser.org/ ์ด ๊ณณ์—์„œ ๋‹ค์šด ๋ฐ›์œผ๋ฉด๋˜๊ณ , ๊ท€์ฐฎ์œผ๋ฉด command์ฐฝ์— sqlite3 ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์— ๊ตณ์ด ์•ˆ์จ๋„ ๋œ๋‹ค.


1๏ธโƒฃ DB ์—ฐ๊ฒฐํ•˜๊ธฐ (์ƒ์„ฑํ•˜๊ธฐ) ๋ฐ cursor ์ƒ์„ฑ

python์—์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๋„ ํ•„์š”์—†๋‹ค ๊ทธ๋ƒฅ ๋ฐ”๋กœ import ํ•˜๋ฉด ๋œ๋‹ค!

import sqlite3
connect = sqlite3.connect("db๋ช…", isolation_level=None)
# isolation_level=None ์‹œ ์˜คํ† ์ปค๋ฐ‹ ์‚ฌ์šฉ.

cur = connect.cursor()

cur.execute("select text from db")

DBํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ๊ทธ DB์™€ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ด๊ณ , ์—†๋‹ค๋ฉด ์ƒ์„ฑ๋  ๊ฒƒ์ด๋‹ค! ์ œ์ผ ๋จผ์ € DB๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปค์„œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  execute ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ฟผ๋ฆฌ๋ฌธ์€ ์ฃผ๋กœ str ํƒ€์ž… ๋ณ€์ˆ˜๋กœ ์ž‘์„ฑํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  DB ์ˆ˜์ •์‹œ commit ๋˜๋Š” rollback ์„ ์‚ฌ์šฉํ•œ๋‹ค. connect.commit()์€ ์ˆ˜์ •๋œ ์‚ฌํ•ญ์„ DB์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด๊ณ , connect.rollback์€ ์ด์ „์œผ๋กœ ๋˜๋Œ๋ฆฐ๋‹ค๋Š” ๋œป์ด๋‹ค. ์›๋ž˜๋Š” ๋งค๋ฒˆ ์ˆ˜์ • ํ›„ ๋ฐ˜์˜์„ ์œ„ํ•ด '๊ผญ!' commit์„ ํ•ด์•ผํ•˜์ง€๋งŒ, ์œ„์—์„œ isolation_level=None ์ด์šฉํ–ˆ๊ธฐ์—, ์•ˆํ•ด๋„ ๋œ๋‹ค.

โž• command ์ฐฝ์œผ๋กœ ์ด์šฉ์‹œ, .open (ํŒŒ์ผ๋ช…) ์„ ์ž…๋ ฅํ•ด DB์— ์ ‘๊ทผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ์‹œ ๋์— ๊ผญ ';'(์„ธ๋ฏธ์ฝœ๋ก )์„ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.


2๏ธโƒฃ DB ๋‹ค๋ฃจ๊ธฐ


์œ„์—์„œ ์ž ๊น ๋‚˜์˜จ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” cur.execute๋ฅผ ์ด์šฉํ•ด DB๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์•Œ์•„๋ณด๊ฒ ๋‹ค.


1. Table ์ƒ์„ฑํ•˜๊ธฐ

cur.execute("CREATE TABLE (์˜ต์…˜:IF NOT EXISTS) (ํ…Œ์ด๋ธ”๋ช…:table1) \
    ((์ปฌ๋Ÿผ:id) (ํƒ€์ž…:integer) (ํ‚ค์„ค์ •:PRIMARY KEY), (์ปฌ๋Ÿผ2:name) (ํƒ€์ž…:text) ...")
  • ํ…Œ์ด๋ธ” ๋ชฉ๋ก ์กฐํšŒ ๋ฐฉ๋ฒ•:SELECT name FROM sqlite_master WHERE type='table';
  • ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํ™•์ธ : select * from sqlite_master where tbl_name='table๋ช…';

2. ๋ฐ์ดํ„ฐ ์‚ฝ์ž… (CREATE)

INSERT INTO (ํ…Œ์ด๋ธ”๋ช…) VALUES (๊ฐ’)

cur.execute("INSERT INTO testtable \
    VALUES(1, 'dong')")

# ์—ฌ๋Ÿฌ ํ–‰ ์‚ฝ์ž…์‹œ
values_tuple = (
    (3, 'hi'),
    (4, 'hello'),
    (5, 'annyeong')
)
cur.executemany("INSERT INTO table1(id, name) VALUES(?,?)", values_tuple) 

ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ๋ฒˆ ํ•˜๊ณ ์‹ถ์œผ๋ฉด executemany ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


3. ๋ฐ์ดํ„ฐ ์กฐํšŒ (READ)

SELECT (ํ•„๋“œ๋ช…) FROM (ํ…Œ์ด๋ธ”๋ช…) (WHERE(์กฐ๊ฑด์ ˆ,์ƒ๋žต๊ฐ€๋Šฅ)) (์ปฌ๋Ÿผ๋ช…)='(๊ฐ’)'

# ํ•„๋“œ๋ช…์— *(์™€์ผ๋“œ์นด๋“œ)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋ชจ๋“  ํ–‰ ๋ถˆ๋Ÿฌ์™€์„œ ๊ฐ€์ ธ์˜จ ๊ฐ’ ์ถœ๋ ฅ
cur.execute("SELECT * FROM testtable")
print(cur.fetchall())

# WHERE ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋ง ๊ฐ€๋Šฅ.
# ? ๋ฅผ ์จ์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๊ณ ,
cur.execute("SELECT * FROM testtable=?", parameter)

# ๋ฌธ์ž์—ด ํฌ๋ฉ”ํŒ…๋„ ๊ฐ€๋Šฅ
cur.execute("SELECT * FROM testtable={}".format(parameter))
# dictionary ํ˜•ํƒœ๋กœ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๊ณ  ๋‹ค์–‘ํ•˜๊ฒŒ ๊ฐ€๋Šฅ..

SELECT ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ cur์— ๊ฐ’์ด ์˜ค๋ฉด, cur.fetchone()๋ฅผ ์จ์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค. ๋ชจ๋“  ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด cur.fetchall()์„ ์‚ฌ์šฉํ•˜๋ฉด iterable ํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.


4. ๋ฐ์ดํ„ฐ ์ˆ˜์ • (UPDATE)

UPDATE (ํ…Œ์ด๋ธ”๋ช…) SET (ํ•„๋“œ๋ช…)=(๊ฐ’) (WHERE(์กฐ๊ฑด์ ˆ))

cur.execute("UPDATE testtable SET name=? WHERE id=?", ('bye', 1))
# ๋˜๋Š” 
cur.execute("UPDATE testtable SET name=:name WHERE id=:id", {"name": 'bongju', 'id': 3})

5. ๋ฐ์ดํ„ฐ ์‚ญ์ œ (DELETE)

DELETE FROM (ํ…Œ์ด๋ธ”๋ช…) (WHERE(์กฐ๊ฑด์ ˆ))

cur.execute("DELETE FROM testtable WHERE id=?", (1))

# ์ด์™ธ ๋“ฑ๋“ฑ..
cur.execute("DELETE FROM testtable WHERE id=:id", {'id': 3})

# where ์ ˆ ์ƒ๋žต์‹œ ๋ชจ๋“  ํ–‰ ์ง€์›€
cur.execute("DELETE FROM testtable)

๋ชจ๋“  ์ž‘์—…์ด ๋๋‚˜๋ฉด connect.close() ์‚ฌ์šฉํ•ด ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค.


๐Ÿ‘‹ ๋งˆ๋ฌด๋ฆฌ


์ด์ƒ์œผ๋กœ SQLite์˜ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ดค๋‹ค. SQLite๋Š” ๊ฑฐ์˜ ์“ฐ์ง€ ์•Š๋Š” DB๋ผ์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, SQL์€ RDBMS์—์„œ๋Š” ๋ฌธ๋ฒ•์ด ๋น„์Šท๋น„์Šทํ•˜๋‹ˆ ์ด์ฐธ์— ๊ฐ์„ ์ตํ˜€๋‘๋Š” ๊ฒƒ๋„ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค! ํ…Œ์ŠคํŠธ ์šฉ๋„๋กœ๋„ ์“ฐ๊ธฐ๋„ ํ•˜๋‹ˆ๊นŒ ์•Œ์•„๋†“์œผ๋ฉด ์ข‹์ง€ ์•Š๊ฒ ๋Š”๊ฐ€~


reference