# 성적처리 프로그램 v6b
# 성적 데이터 추가/ 조회/ 수정/ 삭제 기능 제공
# 입력한 데이터와 처리결과는 테이블에 저장
# 데이터베이스 오라클19c
# 데이터베이스 관련코드는 DAO 파일로 분리해서 작성
import sungjukv6b_lib as sj6blib
# 프로그램 main
while True:
# 메뉴를 화면에 표시하고
# 실행할 메뉴를 선택받아 menu 변수에 저장
menu = sj6blib.display_menu()
# 입력받은 메뉴 구분
if menu == '1':
sj6blib.add_sungjuk()
elif menu == '2':
sj6blib.list_sungjuk()
elif menu == '3':
sj6blib.view_sungjuk()
elif menu == '4':
sj6blib.mdf_sungjuk()
elif menu == '5':
sj6blib.rmv_sungjuk()
elif menu == '0':
print('\t저장 후 프로그램을 종료합니다')
break
else:
print('\t잘못 입력하셨습니다')
libarary
import sungjukv6b_dao as sj6bdao
# 메뉴 정의 함수
def display_menu():
# 화면 출력용 메뉴 정의
main_menu = '''
성적 처리 프로그램 v6
------------------------------
1. 성적 데이터 추가
2. 성적 데이터 조회
3. 성적 데이터 상세 조회
4. 성적 데이터 수정
5. 성적 데이터 삭제
0. 저장 후 프로그램 종료
------------------------------
powered by oracle19c
'''
print(main_menu, end=' ')
# 메뉴 입력
dis_menu = input('=> 작업을 선택하세요 : ')
return dis_menu
# 성적 입력 함수
# 이름, 국어, 영어, 수학 데이터를 입력받아
# 총점, 평균, 학점을 계산하고 oracle19c sungjuk테이블에 저장
def add_sungjuk():
# 성적 데이터 입력받음
name = input('\t=> 이름은? ')
kor = int(input('\t=> 국어는? '))
eng = int(input('\t=> 영어는? '))
mat = int(input('\t=> 수학은? '))
# 입력받은 성적 데이터로 초기화
sj = [name, kor, eng, mat]
# 총점, 평균, 학점을 계산하기 위해
# compute_sungjuk() 호출
sj = compute_sungjuk(sj)
# oracle19c sungjuk테이블에 저장 캡슐화
sj6bdao.insert_sungjuk(sj)
# 입력받은 성적처리 함수
def compute_sungjuk(sj):
tot = sj[1] + sj[2] + sj[3]
avg = tot / 3
grd = '가'
if avg >= 90:
grd = '수'
elif avg >= 80:
grd = '우'
elif avg >= 70:
grd = '미'
elif avg >= 60:
grd = '양'
# 2개의 리스트를 합쳐서 하나로 만듬
sj = sj + [tot, round(avg, 1), grd]
return sj
# 성적 테이터 출력
# 모든 데이터 불러오기
def list_sungjuk():
result = f' 이름 국어 영어 수학 총점 평균 학점\n'
result += '--------------------------------------------------------\n'
print(result)
# sungjuk 테이블에서 이름, 국어, 영어, 수학 등 특정 컬럼만 조회해옴
sj6bdao.select_sungjuk(sj6bdao)
# 성적 데이터 상세 출력
# 이름을 입력받아 그 이름의 학생 성적 데이터를 출력
def view_sungjuk():
sj6bdao.selectOne_sungjuk(sj6bdao)
# 성적 데이터 수정
# 수정할 학생의 데이터가 존재하면
# 국어, 영어, 수학 데이터를 다시 입력받고
# 총점, 평균, 학점을 계산하고 성적테이블에 반영
def mdf_sungjuk():
sj6bdao.update_sungjuk()
# 성적 데이터 삭제
def rmv_sungjuk():
sj6bdao.delete_sungjuk(sj6bdao)
# cx-orcle.readthedocs.io/en/latest
Oracle
import cx_Oracle as pyoracl
import os
# 한글처리를 위해 환경변수 설정
# sungjuk 테이블 정의
#
# create table sungjuk (
# name varchar(15) primary key,
# kor number(3) not null,
# eng number(3) not null,
# mat number(3) not null,
# tot number(3) defalt 0,
# avg number(5,1) defalt 0.0,
# grd char(3) defalt '가'
# );
from sungjukv6_lib import conn
os.putenv('NLS_LANG', '.UTF8')
pyoracl.init_oracle_client(lib_dir=r'c:/Java/oracle_cloud')
# 성적데이터를 sungjuk 테이블에 저장
def insert_sungjuk(sj):
conn = pyoracl.connect(user='admin', password='Bigdata_2022', dsn='bigdata_medium')
cur = conn.cursor()
sql = 'insert into sungjuk values (:name, :kor, :eng, :mat, :tot, :avg, :grd)'
cur.execute(sql, sj)
print(f'{cur.rowcount}행이 입력되었습니다!')
conn.commit
cur.close()
conn.close() # cur는 저장, conn오라클 연결
def compute_sungjuk(sj):
tot = sj[1] + sj[2] + sj[3]
avg = tot / 3
grd = '가'
if avg >= 90:
grd = '수'
elif avg >= 80:
grd = '우'
elif avg >= 70:
grd = '미'
elif avg >= 60:
grd = '양'
# 2개의 리스트를 합쳐서 하나로 만듬
sj = sj + [tot, round(avg, 1), grd]
return sj
# 성적테이블에서 이름, 국어, 영어, 수학만 조회해와서
# 필요한 곳으로 결과를 리턴함
def select_sungjuk(sj):
conn = pyoracl.connect(user='admin', password='Bigdata_2022', dsn='bigdata_medium')
cur = conn.cursor()
sql = 'select name, kor, eng, mat from sungjuk'
cur.execute(sql)
rows = cur.fetchall()
cur.close()
conn.close()
result = ''
for sj in rows:
result += f'|{sj[0]:^10}|{sj[1]:^6}'
result += f'|{sj[2]:^6}|{sj[3]:^6}'
result += f'|{sj[4]:^8}|{sj[5]:^8}'
result += f'|{sj[6]:^3}|\n'
print(result)
def selectOne_sungjuk(sj):
name = input('\t=> 조회할 학생의 이름은? ')
conn = pyoracl.connect(user='admin', password='Bigdata_2022', dsn='bigdata_medium')
cur = conn.cursor()
sql = 'select * from sungjuk where name = :name'
cur.execute(sql, [name]) # 리스트로
sj = cur.fetchone()
cur.close()
conn.close() # cur는 저장, conn오라클 연결
# 조회할 대상이 sjs에 존재하는지 확인
hdr = ''
result = '\t존재하지 않는 학생입니다'
# 만일 찾는 학생의 성적데이터 존재한다면
if sj: # sj none 아니면
result = f' 이름 국어 영어 수학 총점 평균 학점\n'
result += '--------------------------------------------------------\n'
result += f'|{sj[0]:^10}|{sj[1]:^6}'
result += f'|{sj[2]:^6}|{sj[3]:^6}'
result += f'|{sj[4]:^8}|{float(sj[5]):^8}'
result += f'|{sj[6]:^3}|\n'
print(hdr)
print(result)
def update_sungjuk():
result = '\t존재하지 않는 학생입니다'
name = input('\t=> 수정할 학생의 이름은? ')
conn = pyoracl.connect(user='admin', password='Bigdata_2022', dsn='bigdata_medium')
cur = conn.cursor()
sql = 'select * from sungjuk where name = :name'
cur.execute(sql, [name]) # 리스트로
sj = cur.fetchone()
cur.close()
conn.close() # cur는 저장, conn오라클 연결
if sj:
update_sungjuk(sj)
result = '\t수정이 완료되었습니다'
print(result)
def modifying_sungjuk(sj):
kor = int(input(f'\t국어는? [{sj[1]}]=> '))
eng = int(input(f'\t영어는? [{sj[2]}]=> '))
mat = int(input(f'\t수학은? [{sj[3]}]=> '))
sju = [sj[0], kor, eng, mat]
sju = compute_sungjuk(sju)
# 수정된 성적데이터를 sungjuk테이블에 적용
conn = pyoracl.connect(user='admin', password='Bigdata_2022', dsn='bigdata_medium')
cur = conn.cursor()
sql = 'update sungjuk set kor =:kor, eng =:eng, ' \
'mat=:mat, tot=:tot, avg=:avg, grd=:grd ' \
'where name = :name'
# params = {'name':sju[0], 'kor':sju[1], 'eng':sju[2], 'mat':sju[3], 'tot':sju[4], 'avg':sju[5], 'grd':sju[6]}
params = dict(name=sju[0], kor=sju[1], eng=sju[2], mat=sju[3], tot=sju[4], avg=sju[5], grd=sju[6])
cur.execute(sql, params)
print(f'{cur.rowcount}행이 수정되었습니다!')
conn.commit
cur.close()
conn.close() # cur는 저장, conn오라클 연결
def delete_sungjuk(sj):
name = input('\t=> 삭제할 학생의 이름은? ')
conn = pyoracl.connect(user='admin', password='Bigdata_2022', dsn='bigdata_medium')
cur = conn.cursor()
sql = 'delete from sungjuk where name =: name'
cur.execute(sql, [name])
cnt = cur.rowcount
conn.commit
cur.close()
conn.close() # cur는 저장, conn오라클 연결
result = '\t존재하지 않는 학생입니다'
if cnt > 0: result = '의 기록이 삭제되었습니다'
print(result)
return None
'Python' 카테고리의 다른 글
PyCharm - 상속, 추상 클래스 (0) | 2022.05.23 |
---|---|
PyCharm - Oop (객체치향 프로그래밍) (0) | 2022.05.22 |
PyCharm - 데이터베이스 (Oracle) (0) | 2022.05.20 |
PyCharm - 데이터베이스 (sqlite3) (0) | 2022.05.18 |
PhCharm - pickle (0) | 2022.05.18 |