Develop/Python

1007 Python Class,예외처리,DB

포페PostFace 2022. 10. 13. 17:14
class Person :
    def __init__(self,name,age=10):
        self.name=name
        self.age=age
    def show(self):
        print(self.name,'/',self.age) 
    def __str__(self):
        return "Person %s %s" % (self.name,self.age)       
class Employee(Person):
    def __init__(self,name,age,level,pay):
        super().__init__(name, age)
        self.level=level
        self.pay=pay
    def __str__(self):
        return super().__str__()+" Employee %s %d" % (self.level,self.pay) 
p1 = Person('수지',30)
p1.show()
print('p1:',p1)
print(p1.name)
print(p1.age)
p2 = Person('박보검')
p2.show()
print('p2:',p2)
print('-------------------')
e1 = Employee('윤아',20,'대리',200)
e2 = Employee('정국',40,'대리',300)

print('e1:',e1)
print('e2:',e2)
class Tiger:
    def jump(self):
        print('호랑이 jump')
    def cry(self):
        print('호랑이 어흥')
class Lion:
    def bite(self):
        print('사자 bite')
    def cry(self):
        print('사자 으르렁')
class Liger(Tiger,Lion): #파이썬에서는 상속의 상속뿐 아니라 다중상속도 된다.
    def play(self):
        print('라이거와 놀기')

l= Liger()
l.play()
l.jump()
l.bite()
l.cry() #먼저 상속받은 쪽의 메소드를 사용한다. Tiger.cry() 사용
# 연산자 오버로딩
class NumBox:
    def __init__(self,num):
        self.num=num
        self.num2=num
    def __add__(self,num):
        self.num +=num
        return '더하기(add):'+str(self.num)    
    def __radd__(self,num):
        self.num += num
        return '더하기(radd):'+str(self.num)
    def __sub__(self,num):
        self.num -= num    
        return '빼기(sub):'+str(self.num)
num=NumBox(40)
print(num.num)
print(num.num+50)
print(num+50) #참조변수 + 숫자
#__add__ 함수로 작동함
print(num.num)
print(num.num2)
print(10 + num.num)
print(10 + num) #숫자 + 참조변수
#__radd__ 함수로 작동함
print(num.num-3)
print(num-3)
#__sub__ 함수로 작동함

 


예외처리

 

# java 에서는
# try
# catch
# catch
# catch
# finally

x = 10
y = 5
L =[1,2,3]
try:
    print(x/y) #여기서 잡히면
    print('예외처리') #여기는 안닿는다.
    print(L[3]) #IndexError
except ZeroDivisionError as err:
    print('ZeroDivisionError 발생:',err) #err=division by zero
except IndexError as err:
    print('IndexError 발생:',err) #err=list index out of range
else :
    print('else')  #에러가 발생하지 않으면 else로 온다.  
finally:
    print('finally 영역')
print('Hi')
try :
    a = int(input('숫자1: '))
    b = int(input('숫자2: '))
except ValueError :
    print('값이 적절하지 않습니다.')
else:
    print(a,'+',b,'=',a+b)

print('----------------------')
try:    
    f=open('test.txt','r')
except FileNotFoundError :
    print('파일 발견 못함')
else :
    print(f.read())
    f.close()
print('----------------------')
try :
    a = int(input('숫자1: '))
    b = int(input('숫자2: '))
    if a<0 or b<0 :
        raise ArithmeticError('음수 입력됨')
    else :
        print('두 수 모두 양수 입력됨')
except ArithmeticError as err:
    print('예외 발생 :',err)
#제목 예외처리 가격 예외처리 while문 dict 형식
book={}
while True :
    while True:
        try :
            title = input('제목 입력(3~5자)')
            if len(title)<3 or len(title)>5:
                raise NameError('제목은 3~5글자로 입력하세요')
        except NameError as err :
            print(err)
        else :
            break
    while True:        
        try :
            price=int(input('가격입력:'))
        except ValueError :
            print('가격은 숫자로 입력하세요.')
            continue    
        else :
            book[title]=price
            break
    conti=input('계속?')
    if conti.lower() == 'n':
        break
print('book:',book)

 

python db 사용법
window-preferences-PyDev-Interpreter-Python Intepreter- Manage witg pip- install cx_Oracle

 

# java
# jar
# 드라이버 로드
# 계정 접속
# sql 작성,분석
# 실행
# close

import cx_Oracle # 따로 설치해줘야한다.

con =cx_Oracle.connect('sqlid/sqlpw@localhost:1521/orcl') # 연결된 정보를 객체에 담음
cur =con.cursor() #실행한 결과를 담는 저장소
print(type(cur))
try :   
    drop = 'drop table person'
    cur.execute(drop) # 실행 한번만 해줘야한다. 테이블이 없으면 에러남.
except cx_Oracle.DatabaseError :
    print('테이블이 존재하지 않습니다.')
#cx_Oracle.DatabaseError: ORA-02289: 시퀀스가 존재하지 않습니다.
try :    
    dropseq = 'drop sequence perseq'
    cur.execute(dropseq)
except cx_Oracle.DatabaseError :
    print('시퀀스가 존재하지 않습니다.')

seq='create sequence perseq'
cur.execute(seq)
create = '''
    create table person(
        num number primary key,
        id varchar2(10),
        name varchar2(10),
        addr varchar2(10)
    )    
'''
cur.execute(create)

cur.execute('select * from person')
for row in cur:
    print(row)
    
insert ="insert into person values(perseq.nextval,'kim','연아','부산')"
cur.execute(insert)
insert ="insert into person values(perseq.nextval,'song','중기','제주')"
cur.execute(insert)
insert ="insert into person values(perseq.nextval,'park','세리','인천')"
cur.execute(insert)
insert ="insert into person values(perseq.nextval,'hong','길동','원주')"
cur.execute(insert)
con.commit() # commit을 따로 해줘야 한다. con객체에 연결되어 있기때문에 con.commit().
cur.execute('select * from person')
for row in cur: 
    print(row)
#(1, 'kim', '연아', '부산') 
#(2, 'song', '중기', '제주')

update="update person set name='제니' where id='kim'"
cur.execute(update)
con.commit()
print('----------------')
cur.execute('select * from person')
for row in cur: 
    print(row)
print('----------------')
delete ="delete person where id='song'"
cur.execute(delete)
con.commit()
cur.execute('select * from person')
for row in cur: 
    print(row)

cur.close()
con.close() #둘이 따로 끊는다.
import cx_Oracle # 따로 설치해줘야한다.

con =cx_Oracle.connect('sqlid/sqlpw@localhost:1521/orcl') # 연결된 정보를 객체에 담음
cur =con.cursor() #실행한 결과를 담는 저장소

drop = 'drop table employee'
cur.execute(drop)

dropseq = 'drop sequence emplseq'
cur.execute(dropseq)

seq='create sequence emplseq'
cur.execute(seq)

create = '''
    create table employee(
        num number primary key,
        id varchar2(10),
        part varchar2(10),
        position varchar2(10),
        salary number
    )    
'''


cur.execute(create)

while True :
    id=input('id 입력:')
    while True :
        try :
            part = input('part 입력:')
            if len(part) >3 :
                raise NameError('part 글자수 초과 최대 3글자')
        except NameError as err :
            print(err)
        else :
            break
    while True :
        try :
            position=input('position 입력:')
            if len(position) >3 :
                raise NameError('position 글자수 초과 최대 3글자')
        except NameError as err :
            print(err)
        else :
            break
    while True :
        try :
            salary = int(input('salary 입력:'))
            
        except ValueError:
            print('salary는 숫자로 입력하세요.')
        else :
            break
    insert = "insert into employee values(emplseq.nextval,'"+id+"','"+part+"','"+position+"','"+str(salary)+"')"
    print(type(insert))
    cur.execute(insert)
    con.commit()
    end = input('계속? :')
    if end.lower()=='y' :
        continue
    elif end.lower()=='n' :
        break
cur.execute('select * from employee')
print('select * from employee 검색 결과')
for row in cur: 
    print(row)
print('프로그램 종료')    
cur.close()
con.close()
import cx_Oracle # 따로 설치해줘야한다.

con =cx_Oracle.connect('sqlid/sqlpw@localhost:1521/orcl') # 연결된 정보를 객체에 담음
cur =con.cursor() #실행한 결과를 담는 저장소

select= 'select p.id,p.name,e.part,e.position from person p inner join employee e on p.id=e.id'
#'select p.id,p.name,e.part,e.position from person p,employee e where p.id=e.id' natural join
cur.execute(select)

print('결과')
for row in cur: 
    print(row)
cur.close()
con.close()