개요
이전에 2023.01.08-[SQLite] 설치 및 사용에서 간단한 파일 데이터베이스인 SQLite를 설치하고 실행해 보았다. 당시에는 CLI를 활용하여 SQLite를 다뤘는데, 이번에는 Python으로 SQLite를 다뤄보려고 한다.
방법을 알아보자.
sqlite3
SQLite 데이터베이스용 라이브러리인 sqlite3는 Python 기본 내장 라이브러리로 별도로 설치하지 않고 바로 import 하여 사용할 수 있다.
import sqlite3
데이터베이스 연결
connect 함수를 사용하여 데이터베이스 연결을 생성한다. 기본적으로 connect 함수로 전달한 값이 파일 DB의 경로가 된다.
import sqlite3
con = sqlite3.connect('example.db')
아무 테이블도 생성하지 않고 연결만 생성하면 파일만 만들어진다.
만약 파일 DB가 아니라 메모리 DB를 사용하고 싶다면 다음과 같이 ":memory:"라는 특수한 키워드를 전달하면 된다. 메모리 DB는 휘발되기 때문에 일회성이라는 점을 인지하고 있어야 하겠다.
import sqlite3
con = sqlite3.connect(':memory:')
테이블 생성
sqlite3를 사용할 때도 PyMySQL과 유사하게 '커서 생성 -> 쿼리 수행 -> 커밋/롤백 또는 데이터 fetch' 흐름으로 프로그래밍하면 된다.
아래 예시는 stocks라는 테이블을 생성하는 예시이다.
import sqlite3
sql = '''CREATE TABLE stocks
(date text, trans text, symbol text, qty real, price real)'''
# 데이터베이스 연결
con = sqlite3.connect('example.db')
# 커서 생성
cur = con.cursor()
# 쿼리 수행
cur.execute(sql)
# 커밋 종료
con.commit()
# 연결 종료
con.close()
실행하면 테이블이 생성된 모습을 확인할 수 있다.
INSERT
INSERT하는 방식도 동일하게 커서 획득 후 execute를 호출하여 수행한다. 단순 문자열로 처리해도 되고, placeholder를 활용할 수도 있다.
아래 예시는 단순 문자열 쿼리로 테이블에 데이터를 삽입하는 예시이다.
import sqlite3
sql = "INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)"
with sqlite3.connect('example.db') as con:
cur = con.cursor()
cur.execute(sql)
con.commit()
만약 여러 행을 한 번에 추가하고 싶다면 executemany를 사용할 수 있다. PyMySQL과 달리 placeholder를 사용할 때는 '?' 문자를 사용해야 한다.
sql = "INSERT INTO stocks VALUES (?,?,?,?,?)"
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
]
with sqlite3.connect('example.db') as con:
cur = con.cursor()
cur.executemany(sql, purchases)
con.commit()
SELECT
SELECT를 할 때는 curser.execute 호출 후 fetchone 또는 fetchmany, fetchall을 사용한다. fetchone은 한 건을 조회하고, fetchmany는 원하는 수만큼의 데이터를 조회한다. fetchall을 모든 데이터를 조회할 때 사용한다.
아래 예시는 symbol이 RHAT인 데이터를 조회한 것이다.
sql = 'SELECT * FROM stocks WHERE symbol=:symbol'
condition = {'symbol': 'RHAT'}
with sqlite3.connect('example.db') as con:
cur = con.cursor()
cur.execute(sql, condition)
data = cur.fetchall()
con.commit()
print(data)
placeholder에 symbol이라는 이름을 붙이고, execute를 호출할 때 딕셔너리로 매핑할 키와 값을 전달하여 실행했다.
참고 문서
https://docs.python.org/ko/3.8/library/sqlite3.html
https://www.daleseo.com/python-sqlite3/