본문 바로가기

Python

PyCharm - Dao (Data access object)


# 성적처리 프로그램 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