[Python 모듈] sqlite3 : SQLite 데이터베이스를 다루는 모듈

1. sqlite3 모듈이란?

 

sqlite3 모듈은 파이썬에서 SQLite 데이터베이스를 다룰 수 있는 모듈입니다. SQLite는 서버 없이 로컬에서 파일로 데이터베이스를 관리할 수 있으며, 경량화되어 있어서 많은 소프트웨어에서 내장 데이터베이스로 많이 사용됩니다.



sqlite3 모듈은 다음과 같은 기능을 제공합니다.

 

  • SQLite 데이터베이스 생성 및 연결
  • SQL 쿼리 실행
  • 데이터 검색, 추가, 수정, 삭제
  • 트랜잭션 처리

 

sqlite3 모듈은 별도의 설치 과정이 필요없습니다. 모듈을 사용하려면 아래와 같이 import를 하면됩니다.

import sqlite3

 


2. sqlite3.connect

 

sqlite3.connect() 함수는 SQLite 데이터베이스에 연결하는 함수입니다. 이 함수를 사용하여 데이터베이스 파일에 접속하고, 연결된 Connection 객체를 반환합니다.

 

  • database: 연결할 SQLite 데이터베이스 파일의 경로
  • timeout: 연결 시도 시간 초과 시간 (기본값 5.0초)
  • detect_types: 데이터 타입 자동 감지 여부 (기본값 0)
  • isolation_level: 트랜잭션 격리 레벨 설정
  • check_same_thread: 스레드 간 동시 접근 허용 여부
  • factory: 커서 캐시 크기

 

sqlite3.connect(database, timeout=5.0, detect_types=0, isolation_level=None, check_same_thread=True, factory=1000)

 

코드에서는 sqlite3 모듈을 import하여 connect() 함수를 사용합니다. 이때, 연결할 데이터베이스 파일의 경로인 'sample.db'를 인자로 전달합니다. 이후 connect() 함수는 데이터베이스에 연결되어 있는 Connection 객체인 conn을 반환합니다.

 

  • 2: sqlite3.connect('sample.db')를 사용하여 sample.db라는 이름의 SQLite 데이터베이스 파일과의 연결 객체(conn)를 생성합니다. 만약 sample.db 파일이 없으면 새로 생성하고, 이미 존재하면 해당 파일과 연결합니다.
  • 3: conn.cursor()를 사용하여 데이터베이스 연결 객체로부터 커서 객체(c)를 생성합니다. 커서는 SQL 쿼리를 실행하고 결과를 얻어오는 데 사용됩니다.
  • 4: c.execute()를 사용하여 SQL 쿼리를 실행합니다. 이 코드에서는 users 테이블을 생성하는 쿼리를 실행하며, 테이블은 id, name, age라는 3개의 컬럼으로 구성됩니다. 여기서 id는 정수 타입의 기본 키이며, name은 텍스트 타입, age는 정수 타입입니다.
  • 5 : conn.commit()을 사용하여 데이터베이스에 대한 변경 사항을 커밋합니다. 이를 통해 테이블 생성 쿼리가 데이터베이스에 반영됩니다.
  • 6 : conn.close()를 사용하여 데이터베이스 연결을 종료합니다. 이렇게 하면 모든 리소스가 해제되고, 데이터베이스 파일이 닫힙니다.

 

import sqlite3

conn = sqlite3.connect('sample.db')
c = conn.cursor()

c.execute('''CREATE TABLE users
             (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')

conn.commit()

conn.close()

 


3.  sqlite3.Cursor.execute

 

Cursor.execute() 함수는 SQL 쿼리를 실행하는 메서드입니다. 이 함수를 사용하여 데이터베이스에서 데이터를 조회하거나 삽입, 수정, 삭제 등의 작업을 수행할 수 있습니다.

 

  • sql_query: 실행할 SQL 쿼리
  • parameters (선택적): SQL 쿼리에 전달할 파라미터

 

cursor.execute(sql_query, [parameters])

 

sample.db의 person 테이블

person
------
id   | name    | age | city
--------------------------
1    | Alice   | 25  | New York
2    | Bob     | 30  | London
3    | Charlie | 28  | Paris
4    | Dave    | 27  | Berlin
5    | Alice   | 33  | Tokyo

 

sample.db 데이터베이스의 person 테이블에서 name이 'Alice'인 사람의 정보를 조회하는 SQL 쿼리는 다음과 같습니다. (해당 코드는 SQL 쿼리문으로 자세한 내용은 생략합니다.)

SELECT * FROM person WHERE name='Alice'

 

코드에서는 connect() 함수를 사용하여 sample.db 데이터베이스에 연결하고, cursor() 메서드를 사용하여 Cursor 객체를 생성합니다. 이후 execute() 함수를 사용하여 SQL 쿼리를 실행하고, fetchone() 함수를 사용하여 결과를 조회합니다. 마지막으로, 데이터베이스 연결을 종료합니다.

import sqlite3

# 데이터베이스 연결
conn = sqlite3.connect('sample.db')

# 커서 생성
cursor = conn.cursor()

# SQL 쿼리 실행
cursor.execute("SELECT * FROM person WHERE name='Alice'")

# 결과 조회
result = cursor.fetchone()
print(result)

# 연결 종료
conn.close()

 


Cursor.execute() 함수는 SQL 쿼리에 변수를 전달하는 기능도 제공합니다. 이를 위해서는 SQL 쿼리 안에 ?를 사용하여 변수 위치를 표시하고, execute() 함수의 두 번째 파라미터로 변수 값을 전달합니다.



예를 들어, name과 age 변수를 받아 person 테이블에 새로운 레코드를 추가하는 SQL 쿼리는 다음과 같습니다.

INSERT INTO person (name, age) VALUES (?, ?)

 

코드에서는 execute() 함수의 두 번째 파라미터로 변수 값을 전달합니다. 여러 개의 변수를 전달할 경우, 튜플 형태로 전달합니다. 마지막으로, 데이터베이스 연결을 종료하기 전에 반드시 commit() 메서드를 호출하여 변경 내용을 저장해야 합니다.

import sqlite3

# 데이터베이스 연결
conn = sqlite3.connect('sample.db')

# 커서 생성
cursor = conn.cursor()

# 변수
name = 'Alice'
age = 25

# SQL 쿼리 실행
cursor.execute("INSERT INTO person (name, age) VALUES (?, ?)", (name, age))

# 커밋
conn.commit()

# 연결 종료
conn.close()

 


4. sqlite3.Cursor.fetchone

 

Cursor.fetchone() 함수는 SELECT 쿼리의 실행 결과로 반환된 레코드 중 첫 번째 레코드를 가져옵니다. 반환값은 튜플 형태이며, 레코드가 없으면 None을 반환합니다. (레코드는 데이터베이스 테이블에서 행(row)을 의미합니다.)

 

코드에서는 execute() 함수로 SELECT 쿼리를 실행한 후, fetchone() 함수를 사용하여 첫 번째 레코드를 가져옵니다. 가져온 레코드가 있다면 출력하고, 없다면 "레코드가 없습니다."라는 메시지를 출력합니다.

import sqlite3

# 데이터베이스 연결
conn = sqlite3.connect('sample.db')

# 커서 생성
cursor = conn.cursor()

# SQL 쿼리 실행
cursor.execute("SELECT * FROM employee")

# 결과 가져오기
record = cursor.fetchone()

# 결과 출력
if record:
    print(record)
else:
    print("레코드가 없습니다.")

# 연결 종료
conn.close()