데이터베이스 소프트웨어=DBMS
DBMS에는 계층형, 망형, 관계형, 객체지향형, 객체관계형 등으로 나눈다.
그중 가장 많이 사용하는 건 관계형 DBMS(=RDBMS)
속도가 느리다는 단점이 있기는 하지만 요즘 기술이 발달해 예전보다는 많이 나아짐
DBMS-DB-TABLE-ROW&COLUMN
selfstudy13-1.py
.open 데이터베이스 이름
-데이터베이스 생성 또는 열기(있으면 열고 없으면 생성)
create table 테이블 이름(열이름1 데이터형식, 열이름2 데이터형식.....)
-테이블 생성
insert into 테이블 이름 values(값1, 값2...)
-데이터 입력
select * from 테이블이름
-데이터 조회
+추가
.header: 현재 db의 테이블 목록을 보여준다.
.schema 테이블이름: 테이블의 열 및 데이터 형식 등 정보를 보여준다
.header on. 조회시 헤더를 보여준다
mode column: 조회시 컬럼 모드로 출력한다
.quit: 종료
데이터베이스 연결을 위한 코드
.connect()
-데이터베이스 연결
.cursor()
-커서생서->통로 생성
.execute
-명령어 실행(ex. insert.... 또는 select..... 등등)
.commit
-저장
.fetchnone()
-한 행씩 출력
.close
-닫기
Code13-01.py
import sqlite3
##변수 선언 부분##
con, cur = None, None
data1, data2, data3, data4 = "", "", "", ""
sql = ""
##메인코드부분##
con = sqlite3.connect("c:/sqlite/naverDB")
cur = con.cursor()
while(True):
data1 = input("사용자ID ==> ")
if data1 == "":
break
data2 = input("사용자이름 ==> ")
data3 = input("이메일 ==> ")
data4 = input("출생연도 ==> ")
sql = "INSERT INTO userTable VALUES ('" + data1 + "', '" + data2 + "','" + data3 + "', " + data4 +")" #char같은 문자열은 '를 넣어주고 int 같은 숫자는 그냥 집어 넣는다
cur.execute(sql)
con.commit()
con.close()
data1~3은작은따옴표로 묶지만 data4는 정수이므로 묶으면 안된다.
selftstudy13-2.py
import sqlite3
# 변수 선언 부분
con, cur = None, None
data1, data2, data3, data4 = "", "", 0, 0 # 데이터 입력 변수 초기화
sql = ""
# 메인 코드 부분
con = sqlite3.connect("c:/sqlite/naverDB") # 데이터베이스 파일 연결
cur = con.cursor()
# 테이블 생성 (존재하지 않을 경우)
cur.execute("""
CREATE TABLE IF NOT EXISTS productTable (
pCode char(5) PRIMARY KEY,
pName char(3),
price int,
amount int
)
""")
while True:
data1 = input("제품 코드 ==> ")
if data1 == "":
break
data2 = input("제품 이름 ==> ")
data3 = input("가격 ==> ")
data4 = input("재고수량 ==> ")
# SQL문 작성 및 실행
try:
sql = "INSERT INTO productTable (pCode, pName, price, amount) VALUES (?, ?, ?, ?)"
cur.execute(sql, (data1, data2, int(data3), int(data4))) # 파라미터 바인딩으로 안전하게 값 입력
except sqlite3.IntegrityError:
print(f"제품 코드 '{data1}'는 이미 존재합니다. 다른 코드를 사용하세요.")
except ValueError:
print("가격과 재고는 숫자로 입력해야 합니다.")
except Exception as e:
print(f"오류 발생: {e}")
con.commit() # 변경 사항 저장
con.close() # 연결 종료
print("프로그램이 종료되었습니다.")
selfstudy13-3.py
import sqlite3
## 변수 선언 부분 ##
con, cur = None, None
data1, data2, data3, data4 = "", "", 0, 0
row = None
## 메인 코드 부분 ##
con = sqlite3.connect("c:/sqlite/naverDB") # 데이터베이스 연결
cur = con.cursor()
cur.execute("SELECT * FROM productTable") # productTable 조회
print("제품 코드 제품 이름 가격 재고수량")
print("------------------------------------------------")
while True:
row = cur.fetchone()
if row is None:
break
data1 = row[0] # pCode
data2 = row[1] # pName
data3 = row[2] # price
data4 = row[3] # amount
print("%8s %10s %10d %10d" % (data1, data2, data3, data4))
con.close() # 데이터베이스 연결 종료
Code13-02.py
import sqlite3
##변수 선언 부분##
con, cur = None, None
data1, data2, data3, data4 = "", "", "", ""
row = None
##메인코드부분##
con = sqlite3.connect("c:/sqlite/naverDB")
cur = con.cursor()
cur.execute("SELECT * FROM userTable")
print("사용자ID 사용자이름 이메일 출생연도")
print("--------------------------------------------------------------------")
while(True):
row = cur.fetchone()
if row == None:
break
data1 = row[0]
data2 = row[1]
data3 = row[2]
data4 = row[3]
print("%5s %15s %20s %d" %(data1,data2,data3,data4))
con.close()
Code13-03.py
import sqlite3
from tkinter import *
from tkinter import messagebox
# 데이터 삽입 함수
def insertData():
con, cur = None, None
data1, data2, data3, data4 = "", "", "", ""
sql = ""
con = sqlite3.connect("c:/sqlite/naverDB") # DB 경로 설정
cur = con.cursor()
data1 = edt1.get()
data2 = edt2.get()
data3 = edt3.get()
data4 = edt4.get()
try:
sql = "INSERT INTO userTable VALUES('" + data1 + "', '" + data2 + "', '" + data3 + "', " +data4 + ")"
cur.execute(sql)
except:
messagebox.showerror('오류', '데이터 입력 오류가 발생함')
else:
messagebox.showinfo('성공', '데이터 입력 성공')
con.commit()
con.close()
# 데이터 조회 함수
def selectData():
strData1, strData2, strData3, strData4 = [], [], [], []
con = sqlite3.connect("c:/sqlite/naverDB") # DB 경로 설정
cur = con.cursor()
cur.execute("SELECT * FROM userTable")
strData1.append("사용자ID")
strData2.append("사용자이름")
strData3.append("이메일")
strData4.append("출생연도")
strData1.append("--------")
strData2.append("--------")
strData3.append("--------")
strData4.append("--------")
while True:
row = cur.fetchone()
if row is None:
break
strData1.append(row[0])
strData2.append(row[1])
strData3.append(row[2])
strData4.append(row[3])
listData1.delete(0, listData1.size() -1)
listData2.delete(0, listData2.size() -1)
listData3.delete(0, listData3.size() -1)
listData4.delete(0, listData4.size() -1)
for item1, item2, item3, item4 in zip(strData1, strData2, strData3, strData4):
listData1.insert(END, item1)
listData2.insert(END, item2)
listData3.insert(END, item3)
listData4.insert(END, item4)
con.close()
# 메인 코드
window = Tk()
window.geometry("600x300")
window.title("GUI 데이터 입력")
edtFrame = Frame(window)
edtFrame.pack()
listFrame = Frame(window)
listFrame.pack(side=BOTTOM, fill=BOTH, expand=1)
edt1 = Entry(edtFrame, width=10)
edt1.pack(side=LEFT, padx=10, pady=10)
edt2 = Entry(edtFrame, width=10)
edt2.pack(side=LEFT, padx=10, pady=10)
edt3 = Entry(edtFrame, width=10)
edt3.pack(side=LEFT, padx=10, pady=10)
edt4 = Entry(edtFrame, width=10)
edt4.pack(side=LEFT, padx=10, pady=10)
btnInsert = Button(edtFrame, text="입력", command=insertData)
btnInsert.pack(side=LEFT, padx=10, pady=10)
btnSelect = Button(edtFrame, text="조회", command=selectData)
btnSelect.pack(side=LEFT, padx=10, pady=10)
listData1 = Listbox(listFrame, bg='yellow')
listData1.pack(side=LEFT, fill=BOTH, expand=1)
listData2 = Listbox(listFrame, bg='yellow')
listData2.pack(side=LEFT, fill=BOTH, expand=1)
listData3 = Listbox(listFrame, bg='yellow')
listData3.pack(side=LEFT, fill=BOTH, expand=1)
listData4 = Listbox(listFrame, bg='yellow')
listData4.pack(side=LEFT, fill=BOTH, expand=1)
window.mainloop()