[python] sqlite3 사용하기

이번 글에서는 파이썬에서 sqlite3을 사용하는 방법에 대해 알아보겠습니다.

sqlite3

sqlite3은 python에서 사용가능한 데이터베이스 라이브러리입니다. 확장자 .db를 가지는 파일이 생성됩니다.
파이썬에서 sqlite3를 만들어 보기전에 아래 링크에 접속하여 DB Browser for SQLite 프로그램을 설치해줍니다.
DB Browser for SQLite는 파이썬에서 만든 .db 파일을 확인할 때 사용됩니다.

DB Browser for SQLite 링크

win64.msi 다운

Desktop 체크

DB Browser for SQLite

테이블 구조

아래 표는 sqlite3에서 제공하는 5가지 기본 자료형입니다.

SQLite3파이썬
NULLNone
INTEGERint
REALfloat
TEXTstr
BLOBbytes

이 자료형들을 가지고 아래의 구조를 가진 student 테이블을 만들어보겠습니다.

No (INTEGER)Name (TEXT)Age (INTEGER)Sex (TEXT)Phone (TEXT)
1minsoo20male010-1111-2222
2hyeona22female010-3333-3333
3jihae25female010-1234-5678
Create

아래는 테이블을 만드는 Create 샘플 코드입니다. 

import sqlite3

db_name = "student.db"

# create
conn = sqlite3.connect(db_name)
cur = conn.cursor()
conn.execute('CREATE TABLE student (No INTEGER, Name TEXT, Age INTEGER, Sex TEXT, Phone TEXT)')
conn.close()

sqlite3.connect 함수를 호출하면, db가 없을 때 생성해주고, db가 이미 존재하면 해당 db을 open합니다.
최초로 실행하면 student.db가 생성된 것을 볼 수 있습니다.

이것을 위에서 설치한 DB Browser for SQLite 프로그램으로 열으면 데이터베이스 구조를 확인할 수 있습니다.

정상적으로 잘 생성 되었네요.

Insert

바로 코드를 알아보겠습니다.

# insert
conn = sqlite3.connect(db_name)
cur = conn.cursor()
cur.execute("INSERT INTO student VALUES (1, 'minsoo', 20, 'male', '010-1111-2222')")
cur.execute("INSERT INTO student VALUES (2, 'hyeona', 22, 'female', '010-3333-3333')")
cur.execute("INSERT INTO student VALUES (3, 'jihae', 25, 'female', '010-1234-5678')")
# executemany로 여러 개를 한번에 넣을수 있음
# cur.executemany('INSERT INTO student VALUES (?, ?, ?, ?, ?)',
#                 [(1, 'minsoo', 20, 'male', '010-1111-2222'),
#                  (2, 'hyeona', 22, 'female', '010-3333-3333'),
#                  (3, 'jihae', 25, 'female', '010-1234-5678')])
conn.commit()
conn.close()

cursor를 받은 뒤 executeexecutemany를 통해 insert를 할 수 있습니다.
코드를 실행하면 정상적으로 데이터가 삽입된 것을 확인할 수 있습니다.

select

select 샘플 코드는 아래와 같습니다.

# select
conn = sqlite3.connect(db_name)
cur = conn.cursor()
cur.execute("SELECT * FROM student")
# cur.execute("SELECT * FROM student WHERE No=2") # 조건 예시
rows = cur.fetchall()

for row in rows:
    print(row)
    
conn.close()

위에서 입력한 데이터가 정상적으로 출력되는 것을 볼 수 있습니다.

update

update 샘플 코드는 아래와 같습니다.

# update
conn = sqlite3.connect(db_name)
cur = conn.cursor()
cur.execute("UPDATE student SET Phone=? WHERE No=?", ('010-9876-5432', 2)) # 튜플
# cur.execute("UPDATE student SET Phone=:Phone_new WHERE No=:No_new", {"Phone_new":'010-9876-5432', "No_new":2}) # 딕셔너리
# cur.execute("UPDATE student SET Phone=\'{Phone_new}\' WHERE No={No_new}".format(Phone_new='010-9876-5432', No_new=2)) # format
conn.commit()
conn.close()

실행 해보면 해당 위치가 변경된 것을 볼 수 있습니다.

delete

delete 샘플 코드는 아래와 같습니다.

# delete
conn = sqlite3.connect(db_name)
cur = conn.cursor()
cur.execute("DELETE FROM student WHERE No=?", (2, ))
conn.commit()
conn.close()

해당 Row가 삭제되는 것을 확인할 수 있습니다.

테이블 확인

최초 실행할 때 Table을 생성하면 정상적으로 실행되지만, 그 다음부터는 DB에 테이블이 이미 존재한다고 에러가 발생합니다..

try – except를 통해 예외 처리를 할 수도 있지만, 아래 코드처럼 table을 조회하여 존재 유무를 판단할 수 있습니다.

# check table
conn = sqlite3.connect(db_name)
cur = conn.cursor()

cur.execute('SELECT * from sqlite_master WHERE type="table" AND name="student"')
rows = cur.fetchall()
print(rows)

conn.close()

이상으로 파이썬에서 sqlite3을 사용하는 법을 알아보았씁니다.