본문 바로가기

programming/Gukbi

국비 교육 98일차 - python db연결, 함수화

728x90
반응형

python에서 db연결하는법, 함수화 시키는 법을 배웠다. 

 

일단 오라클 연결방법은 자바에서보다 훨씬 간단하다. 

# 오라클 (sqlite)
import cx_Oracle
conn=cx_Oracle.connect("hr/happy@localhost:1521/XE")
cursor=conn.cursor()
item=[
    ('jeno',90,80,75),
    ('renjun',80,85,79),
    ('js25',59,86,63),
    ('chenle',55,53,84),
    ('fullsun',85,83,21)
]
sql="INSERT INTO python_student VALUES(ps_no_seq.nextval,:1,:2,:3,:4)"
for row in item:
    cursor.execute(sql,row)
print("데이터 첨부 완료")
cursor.close()
conn.close()

 cx_Oracle을 import하고, conn객체에 아이디/비번/ip:1521/xe를 적어준다. 그리고 cursor를 열어주고, sql문장을 넣어주면 실행이 완료된다. 

 

import cx_Oracle
conn=cx_Oracle.connect("hr/happy@localhost:1521/XE")
cursor=conn.cursor()
sql="SELECT /* INDEX_ASC(python_student ps1_hakbun_pk) */ * FROM python_student"
cursor.execute(sql)
# print
for row in cursor:
    for r in row:
        print(r,end=" ")
    print('')

 index를 사용해서 검색결과를 더 빠르게 가져오는 코드

row를 사용해서 for문을 돌리고 한줄씩 가져온다.

 

import cx_Oracle
conn=cx_Oracle.connect("hr/happy@localhost:1521/XE")
cursor=conn.cursor()
sql="SELECT COUNT(*) FROM python_student"
cursor.execute(sql)
count=cursor.fetchone()
print(count[0])
cursor.close()
hakbun=int(input(f"1~{count} 중에 삭제할 번호를 선택하세요"))
sql=f"DELETE FROM python_student WHERE hakbun={hakbun}"
cursor=conn.cursor()
cursor.execute(sql)
conn.commit()
print(f"{hakbun} 삭제 완료")
cursor.close()
conn.close()

delete문장 사용법 f"" format을 사용해서 값을 받아오거나 할 수 있다. 

import cx_Oracle

conn=cx_Oracle.connect("hr/happy@localhost:1521/XE")
cursor=conn.cursor()
sql="""
    UPDATE python_student SET
    name=:1,kor=:2, eng=:3, math=:4
    WHERE hakbun=:5
"""
data=('jeno 수정',80,90,35,1)
cursor.execute(sql,data)
conn.commit()
cursor.close()

cursor=conn.cursor
sql="SELECT * FROM python_student"
cursor.execute(sql)
for row in cursor:
    print(row)
cursor.close()
conn.close()

 update문장 

값을 받아올때 변수=:{입력값} 의형식으로 받을 수 있다. 위의 예제의 경우 data라는 튜플에 한번에 담아서 값을 채워넣어 줬다. 

 

 

import sqlite3
# 연결
conn=sqlite3.connect("student.db")
cur=conn.cursor()
'''
sql="""
    CREATE TABLE student(hakbun int, name text, kor int, eng int, math int)
"""
'''
# 데이터 추가
'''
sql="""
    INSERT INTO student VALUES(:hakbun, :name, :kor, :eng, :math)
"""
data={"hakbun":1,"name":'jeno',"kor":90,"eng":80,"math":77}
cur.execute(sql,data)
print("data inserted")
conn.commit()

sql="""
    INSERT INTO student VALUES(?,?,?,?,?)
"""
data=(2,'yujin',98,100,100)
cur.execute(sql,data)
cur.close()
'''
data=[
        (3, 'chenle', 98,98,88),
        (4, 'js25', 55,26,86),
        (5, 'nana', 78,89,58),
        (6, 'mark', 58,88,97),
        (7, 'fullsun',78,56,78)
    ]
sql="""
    INSERT INTO student VALUES(?,?,?,?,?)
"""
cur.executemany(sql,data)
conn.commit()
cur.close()
cur=conn.cursor()
sql="SELECT * FROM student"
cur.execute(sql)
data=cur.fetchall()
print(data)
cur.close()
conn.close()

 sqlite3 을 써서 값을 저장하고 불러와주는 연습을 해봤다. 사용법은 거의 비슷하긴 한데, 값을 넣어줄때 사용하는 문법이 조금 달라서 유의해서 보면 될 것 같다.

 

import sqlite3
#1. 연결 
def studentListData():
    conn=sqlite3.connect("student.db")
    cur=conn.cursor()
    sql="""
          SELECT hakbun,name,kor,eng,math,
                 (kor+eng+math),ROUND((kor+eng+math)/3.0,2)
          FROM student
        """
    cur.execute(sql)
    for row in cur:
        print(row)
    cur.close()
    conn.close()

#함수 호출 
#studentListData()
def studentDetailData(hakbun):
    conn=sqlite3.connect("student.db")
    cur=conn.cursor()
    sql=f"""
          SELECT hakbun,name,kor,eng,math,
                 (kor+eng+math),ROUND((kor+eng+math)/3.0,2)
          FROM student
          WHERE hakbun={hakbun}
         """
    cur.execute(sql)
    data=cur.fetchone()
    for row in data:
        print(row)
    cur.close()
    conn.close()
    
#호출 
studentDetailData(7)    

 

이 총 과정을 함수화해서 만든 예제!

별로 어렵진 않다..

 

'''
    함수 
    1. 전체 목록 출력  def select() 
    2. 상세보기       def detail(hakbun)
    3. 데이터 추가    def insert(튜플)
    4. 데이터 수정    def update(튜플) (....)
    5. 데이터 삭제    def delete(hakbun)
    6. 검색          def find(name)
'''
import cx_Oracle

def select(page):
    conn=cx_Oracle.connect("hr/happy@localhost:1521/xe")
    cur=conn.cursor()
    rowSize=10
    start=(rowSize*page)-(rowSize-1)
    end=rowSize*page
    sql=f"""
         SELECT hakbun,name,kor,eng,math,total,score,rank,num 
         FROM (SELECT hakbun,name,kor,eng,math,(kor+eng+math) as total,
               ROUND((kor+eng+math)/3.0,2) as score,
               RANK() OVER(ORDER BY (kor+eng+math) DESC) as rank,rownum as num
         FROM (SELECT /*+ INDEX_ASC(python_student ps1_hakbun_pk)*/ hakbun,name,kor,eng,math 
         FROM python_student))
         WHERE num BETWEEN {start} AND {end}
        """
    #실행 
    cur.execute(sql)
    #출력 
    for row in cur:
        for std in row:
            print(std,end=" ")
        print('')
        
    #닫기
    cur.close()
    conn.close()

#함수 호출 
#page=int(input("페이지 설정:"))
#select(page)
def detail(hakbun):
    conn=cx_Oracle.connect("hr/happy@localhost:1521/xe")
    cur=conn.cursor()
    sql=f"""
           SELECT hakbun,name,kor,eng,math,(kor+eng+math),
                  ROUND((kor+eng+math)/3.0,2)
           FROM python_student
           WHERE hakbun={hakbun}
         """
    cur.execute(sql)
    data=cur.fetchone() #selectOne 
    #fetchall() = selectList
    print(f"학번:{data[0]}")
    print(f"이름:{data[1]}")
    print(f"국어:{data[2]}")
    print(f"영어:{data[3]}")
    print(f"수학:{data[4]}")
    print(f"총점:{data[5]}")
    print(f"평균:{data[6]}")
    cur.close()
    conn.close()
    
#호출 
#detail(1)
#검색 
def find(name):
    conn=cx_Oracle.connect('hr/happy@localhost:1521/xe')
    cur=conn.cursor()
    sql=f"""
          SELECT * FROM recipe
          WHERE title LIKE '%{name}%'
        """
    cur.execute(sql)
    data=cur.fetchall()
    print(data)
    cur.close()
    conn.close()

#호출 
name=input("검색어 입력:")
find(name)

def delete(hakbun):
    conn=cx_Oracle.connect("hr/happy@localhost:1521/xe")
    cur=conn.cursor()
    sql=f"""
          DELETE FROM python_student
          WHERE hakbun={hakbun}
         """
    cur.execute(sql)
    print("삭제 완료!!")
    conn.commit()
    cur.close()
    conn.close()
#함수 호출 
#hakbun=int(input("삭제할 학번 입력:"))
#delete(hakbun)
#select(1)
def update(data):
    #오라클 연결
    conn=cx_Oracle.connect("hr/happy@localhost:1521/xe")
    cur=conn.cursor()
    sql="""
          UPDATE python_student SET
          name=:1 , kor=:2 , eng=:3 , math=:4
          WHERE hakbun=:5
        """
    cur.execute(sql,data)
    conn.commit()
    print("수정 완료")
    cur.close()
    conn.close()
    
#호출 
#update(('박문수수정',100,100,90,3))
#select(2)

def insert(data):
    conn=cx_Oracle.connect("hr/happy@localhost:1521/xe")
    cur=conn.cursor()
    sql="""
         INSERT INTO python_student VALUES(
           ps_no_seq.nextval,:1,:2,:3,:4
         )
        """
    cur.execute(sql,data)
    conn.commit()
    print("추가 완료")
    cur.close()
    conn.close()
    
#호출 
#insert(('이순신님',100,100,100))
#select(2)

 자바와 파이썬에서 db를 연결할때 다른 점 중에 하나는, commit이 자동으로 되지 않는다는점이다. 

그래서 파이썬에서는 꼭 commit을 따로 날려주어야 한다. 

 

db연결과 함수화를 동시에 배웠는데, 이미 자바에서 주구장창 배웠던 부분이라 그렇게 어렵게 느껴지진 않았다. 

다만 이제 실제 웹 프로그래밍에서 어떻게 쓰일지가 궁금하다. 빨리 실습을 해보고 싶다.

 

728x90
반응형