프로젝트형 IoT 서비스 개발 4회차/1. 인터페이스 개발

[Day10] 2022-02-09(수) 파이썬 기본8 - 파일, SQLite - 이진만 강사님

powerstone 2022. 2. 12. 15:26
728x90

 [1] 파일 입출력

    (1) 파일 열기 : 변수 = open(파일경로, '모드')

        모드 : r(읽기), w(쓰기), a(추가)...

    (2) 파일 읽기 : 변수.read()

    (3) 파일에 쓰기 : 변수.write(문자열)

    (4) 파일 닫기 : 변수.close()

 

readwrite.py

# 파일 입출력

def filewrite(name, content):
    try:
        f = open(name, 'wt')
        f.write(content)
    except:
        print("Error")
    finally:
        f.close()


def fileread(name):
    f = None
    try:
        f = open(name, 'rt')
        text = f.read()
    except FileNotFoundError as fe:
        # print("파일을 못 찾았습니다.")
        raise fe
    except IOError as ie:
        raise ie
    finally:
        if f is not None:
            f.close()
    return text

 

readwriteapp.py

import readwrite

def start():
    # name = input("Input File Name..? ")
    # content = input("Write Contents : ")
    # readwrite.filewrite(name, content)
    rname = input("Input read File Name..? ")
    try:
        rcontent = readwrite.fileread(rname)
        print(rcontent)
    except FileNotFoundError:
        print("File Not Found,,,")
    except IOError:
        print("IO Error")

if __name__ == '__main__':
    start()

[2] 데이터베이스

    (1) SQLite

        - 무료 DBMS, 경량형, 소규모에 적합, 일반적인 정보 저장용으로는 충분

        - 파이썬은 SQLite에 대한 라이브러리를 기본 내장(별도 설치X)

        - import sqlite3 로 불러서 사용

    (2) 기본 사용 구조

        ----------------------------------------------------------------------------------------

        con = sqlite3.connect(DB 파일)     # DB 파일 연결(open) (ex> 'data.db')

        cursor = con.cursor()    # 연결된 파일의 커서 생성 및 변수에 저장

        # SQL 명령 실행

        cursor.close()    # 커서 닫기

        con.close()    # 파일 연결 끊기

        ------------------------------------------------------------------------------------------

    (3) SQL 명령 실행을 위한 함수

        - 커서.execute( SQL문 ) : SQL문 실행

        - 연결.commit() : INSERT, DELETE, UPDATE 하는 경우 마지막에 최종 승인 진행(이 함수가 없으면 INSERT, DELETE, UPDATE 진행 안됨)

        - 커서.fetchall() : 커서로 DB의 모든 데이터를 선택해서 [( ), ( ), ...] 리스트 내 튜플 형태로 return(SELECT문에서 사용)

        - 커서.fetchone() : 커서로 맨 처음 레코드를 ( , , ...)튜플로 return, 반복해서 함수 호출시 그 차례대로 return 하고 더 이상 레코드가 없으면 None return(SELECT문에서 사용, 조건을 줘서 일부 record만 선택 가능)

 

    (4) 기본적인 SQL문 ( 커서.execute( SQL문 ) 으로 입력됨)

        - DROP : TABLE 전체 삭제 (ex> "DROP TABLE IF EXISTS 테이블명")

        - CREATE : TABLE 생성 ( ex> "CREATE TABLE 테이블명 (필드명1 형식 PRIMARY KEY,

                                                필드명2 형식, 필드명3 형식,...)" )

        - SELECT : TABLE 조회(읽어오기) ( ex> "SELECT * FROM 테이블명 WHERE 필드명N = 필드N값" ) -> 필드값이 없으면, fetchone() 함수가 None 반환

        - INSERT : 레코드 추가 ( ex> "INSERT INTO 테이블명 VALUES (필드1값, 필드2값,... )" )

        - UPDATE : 레코드 수정 ( ex> "UPDATE 테이블명 SET 필드명1 = 필드1값,.....

                                                WHERE 필드명N = 필드N값" )

        - DELETE : 레코드 삭제 ( ex> "DELETE FROM 테이블명 WHERE 필드명N = 필드N값" )

        (- WHERE 조건 줄 때 KEY필드로 조건을 줘야하는지는 아직 몰?루)

    (5) p.s. 찾아보니 SQLite는 필드 관련 설정 변경이 불가능(필드 타입이나, 디폴트값 등)

 

# itemsql.py

MAKE_TABLE = """
    CREATE TABLE IF NOT EXISTS tb_item(
        id INT PRIMARY KEY,
        name CHAR(20),
        price INT,
        rate REAL
    )
"""
ITEM_INSERT = """
    INSERT INTO tb_item VALUES (%d, "%s", %d, %f)
"""
ITEM_UPDATE = """
    UPDATE tb_item SET name="%s", price=%d, rate=%f WHERE id=%d
"""
ITEM_DELETE = """
    DELETE FROM tb_item WHERE id=%d
"""
ITEM_SELECT_ONE = """
    SELECT * FROM tb_item WHERE id=%d
"""
ITEM_SELECT = """
    SELECT * FROM tb_item
"""
# itemdb.py
import sqlite3
import itemsql  # SQL문 모아놓은 모듈


def connect(dbname):
    con = sqlite3.connect(dbname)
    return con


def close(*cs):
    for c in cs:
        if c is not None:
            c.close()


def makeTable(name):
    con = None
    cs = None
    try:
        con = connect(name)
        cs = con.cursor()
        cs.execute(itemsql.MAKE_TABLE)
        con.commit()
    except:
        raise Exception
    finally:
        close(cs, con)


def insert(*data):
    con = None
    cs = None
    try:
        con = connect('item.db')
        cs = con.cursor()
        cs.execute(itemsql.ITEM_INSERT % data)
        con.commit()
    except:
        raise Exception
    finally:
        close(cs, con)


def delete(id):
    con = None
    cs = None
    try:
        con = connect('item.db')
        cs = con.cursor()
        cs.execute(itemsql.ITEM_DELETE % id)
        con.commit()
    except:
        raise Exception
    finally:
        close(cs, con)


def update(*data):
    con = None
    cs = None
    try:
        con = connect('item.db')
        cs = con.cursor()
        id = data[0]
        name = data[1]
        price = data[2]
        rate = data[3]
        cs.execute(itemsql.ITEM_UPDATE % (name, price, rate, id))
        con.commit()
    except:
        raise Exception
    finally:
        close(cs, con)


def selectone(id):
    con = None
    cs = None
    try:
        con = connect('item.db')
        cs = con.cursor()
        cs.execute(itemsql.ITEM_SELECT_ONE % id)
        result = cs.fetchone()
    except:
        raise Exception
    finally:
        close(cs, con)
    return result


def select():
    con = None
    cs = None
    try:
        con = connect('item.db')
        cs = con.cursor()
        cs.execute(itemsql.ITEM_SELECT)
        results = cs.fetchall()
    except:
        raise Exception
    finally:
        close(cs, con)
    return results
# itemapp.py
import itemdb   # item.db 관리 함수 모아놓은 모듈


def start():
    print("Start App")
    itemdb.makeTable('item.db')
    while True:
        cmd = input("Input CMD(q, i, s, so, u, d):")

        if cmd == 'q':
            break

        elif cmd == 'i':
            print("Insert Item")
            try:
                id = int(input("Input ID: "))
                name = input("Input Name: ")
                price = int(input("Input Price: "))
                rate = float(input("Input rate: "))
                itemdb.insert(id, name, price, rate)
                print("Insert Complete")
            except:
                print("Insert Error")

        elif cmd == 's':
            print("Select All")
            try:
                datas = itemdb.select()
                # 조회 시 아이디와 이름 가격만 출력
                for data in datas:
                    print("ID: %d, Name: %s, Price: %d" % data[:3])

                # for data in datas:
                #     print("ID: %d, Name: %s, Price: %d, Rate: %.1f" % data)
                print("Select All Complete")
            except:
                print("Select Error")

        elif cmd == 'so':
            print("Select One")
            try:
                id = int(input("Input ID: "))
                data = itemdb.selectone(id)
                print("ID: %d, Name: %s, Price: %d, Rate: %.1f" % data)
                print("Select One Complete")
            except:
                print("Select One Error")

        elif cmd == 'u':
            print("Update Item")
            try:
                id = int(input("Input ID: "))
                name = input("Input Name: ")
                price = int(input("Input Price: "))
                rate = float(input("Input rate: "))
                itemdb.update(id, name, price, rate) # 함수 작성시 id가 맨 앞에 오게 했음
                print("Update Item Complete")
            except:
                print("Update Error")

        elif cmd == 'd':
            print("Delete Item")
            try:
                id = int(input("Input ID: "))
                itemdb.delete(id)
                print("Delete Item Complete")
            except:
                print("Delete Error")

        print("")

    print("End App")


if __name__ == '__main__':
    start()
728x90