[Day10] 2022-02-09(수) 파이썬 기본8 - 파일, SQLite - 이진만 강사님
[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()