Python

[Python]SQLite3 모듈: 파이썬에서 DB연동하기 응용(예제 포함)

zzheng 2024. 5. 24. 18:53

파이썬으로 DB 만들기 : 함수를 사용해서 정리해보기

import sqlite3

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

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

# 테이블 생성
cursor.execute("""DROP TABLE IF EXISTS info""")

cursor.execute("""
CREATE TABLE INFO (
    NO INTEGER PRIMARY KEY AUTOINCREMENT, 
    NAME TEXT(20) NOT NULL,
    AGE INTEGER CHECK (1 < AGE AND AGE < 120),
    BTYPE TEXT(2),
    BIRTH TEXT
);
""")

# CREATE
def create_info(name, age, btype, birth):
    cursor.execute("INSERT INTO INFO (NAME, AGE, BTYPE, BIRTH) VALUES (?, ?, ?, ?)", (name, age, btype, birth))
    conn.commit()
    print("New row added")

# 전체 조회 READ
def read_info():
    cursor.execute("SELECT * FROM INFO")
    return cursor.fetchall()

# 번호 조회 READ 
def read_info_no(no):
    cursor.execute("SELECT * FROM INFO WHERE NO=?", (no,))
    return cursor.fetchall()

# 이름 조회 READ 
def read_info_name(name):
    cursor.execute("SELECT * FROM INFO WHERE NAME=?", (name,))
    return cursor.fetchall()

# UPDATE
def update_info_no(no, name, age, btype, birth):
    cursor.execute("UPDATE INFO SET NAME=?, AGE=?, BTYPE=?, BIRTH=? WHERE NO=?", (name, age, btype, birth, no))
    conn.commit()
    print(f"Row with NO={no} updated.")

# DELETE
def delete_info(no):
    cursor.execute("DELETE FROM INFO WHERE NO=?", (no,))
    conn.commit()
    print(f"Row with NO={no} deleted.")

# 데이터 추가
create_info('John', 30, 'A', '1993-01-01')

# 데이터 조회
rows = read_info()
for row in rows:
    print(row)

# 데이터 수정
update_info_no(1, 'Jane', 25, 'B', '1998-02-01')

# 수정된 데이터 조회
print(read_info_name('Jane'))

# 데이터 삭제
delete_info(1)

# 삭제된 데이터 조회
print(read_info_no(1))

# 커서 닫기
cursor.close()

# 데이터베이스 연결 닫기
conn.close()

 

<실행결과>

 

 

파이썬으로 DB 만들기 : Class 을 활용해서 정리해보기

import sqlite3

# 하나의 ROW를 표현하기 위한 클래스
# VO(Value Object): 값을 표현하는 클래스
# DTO(Data Transfer Object): 레이어 간 데이터 전송을 위해 정의하는 클래스
class InfoVO:
    def __init__(self, no=None, name=None, age=None, btype=None, birth=None):
        self.no = no
        self.name = name
        self.age = age
        self.btype = btype
        self.birth = birth

    def __str__(self):
        return f"InfoVO(no={self.no}, name={self.name}, age={self.age}, btype={self.btype}, birth={self.birth})"

# DAO(Data Access Object): 데이터베이스에 접근하여 조작하는 기능을 정의한 클래스
class InfoDAO:
    def __init__(self, conn):
        self.conn = conn
        self.cursor = conn.cursor()

    def create(self, vo):
        self.cursor.execute("INSERT INTO INFO (NAME, AGE, BTYPE, BIRTH) VALUES (?, ?, ?, ?)", 
                            (vo.name, vo.age, vo.btype, vo.birth))
        self.conn.commit()
        print("New row added")
                            
    def read_all(self):
        self.cursor.execute("SELECT * FROM INFO")
        rows = self.cursor.fetchall()
        result = []
        for row in rows:
            vo = InfoVO(*row)
            result.append(vo)
        return result

    def read_by_no(self, no):
        self.cursor.execute("SELECT * FROM INFO WHERE NO=?", (no,))
        row = self.cursor.fetchone()
        if row:
            vo = InfoVO(*row)
            return vo
        else:
            return None

    def read_by_name(self, name):
        self.cursor.execute("SELECT * FROM INFO WHERE NAME=?", (name,))
        rows = self.cursor.fetchall()
        result = []
        for row in rows:
            vo = InfoVO(*row)
            result.append(vo)
        return result

    def update(self, vo):
        self.cursor.execute("UPDATE INFO SET NAME=?, AGE=?, BTYPE=?, BIRTH=? WHERE NO=?", 
                            (vo.name, vo.age, vo.btype, vo.birth, vo.no))
        self.conn.commit()
        print(f"Row with NO={vo.no} updated.")

    def delete(self, no):
        self.cursor.execute("DELETE FROM INFO WHERE NO=?", (no,))
        self.conn.commit()
        print(f"Row with NO={no} deleted.")

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

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

# 테이블 생성
cursor.execute("""DROP TABLE IF EXISTS info""")

cursor.execute("""
CREATE TABLE INFO (
    NO INTEGER PRIMARY KEY AUTOINCREMENT, 
    NAME TEXT(20) NOT NULL,
    AGE INTEGER CHECK (1 < AGE AND AGE < 120),
    BTYPE TEXT(2),
    BIRTH TEXT
);
""")

dao = InfoDAO(conn)

# 데이터 추가
dao.create(InfoVO(-1, 'John', 30, 'A', '1993-01-01'))

# 데이터 조회
rows = dao.read_all()
for row in rows:
    print(row)

# 데이터 수정
dao.update(InfoVO(1, 'Jane', 25, 'B', '1998-02-01'))

# 수정된 데이터 조회
rows = dao.read_by_name('Jane')
for row in rows:
    print(row)

# 데이터 삭제
dao.delete(1)

# 삭제된 데이터 조회
print(dao.read_by_no(1))

# 커서 닫기
cursor.close()

# 데이터베이스 연결 닫기
conn.close()

 

<실행결과>