Python/데이터 분석

(데이터 분석)파이썬 -오라클 연동 데이터 핸들링

choisanghyun 2022. 1. 3. 18:07
728x90

 

함수 정의 (insert, update, delete)

import cx_Oracle as cx
# API = 패키지  --- 라이브러리

# conn = cx.connect("ai","0000","127.0.0.1:1521/XE")
# if bool(conn):
#     print("연결성공")
# else:
#     print("연결실패")
#
# cur = conn.cursor() #커서로 데이터 접근가능
# cur.execute("select * from emp") #emp 데이터 가져와라 (SQL문)
# for c in cur:
#     print(c) #() 튜플 : 수정,삭제 불가
#
# cur.close() #커넥션 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
# conn.close()

#------------------------------------------------------------

#---------------------------------------------------------------
def my_select(ename=None): #줘도그만 안줘도그만 None
    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    if bool(conn):
        print("연결성공")
    else:
        print("연결실패")

    cur = conn.cursor()  # 커서로 데이터 접근가능

    if bool(ename):
        sql = f"select * from emp where ename='{ename}'"  # emp 데이터 가져와라 (SQL문)
    else:
        sql = "select * from emp"
    cur.execute(sql)

    for c in cur: #커서는 한줄씩 가져옴(for문을 통해서 전체 출력가능)
        print(c)  # () 튜플 : 수정,삭제 불가

    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.close()

#------------------------------호출---------------------
# my_select('KING')
# my_select()


def my_insert(empno, ename=None, deptno=None):

    sql = """insert
             into emp(empno, ename, deptno)
             values(:empno, :ename , :deptno)"""

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.execute(sql,[empno, ename, deptno])
    #cur.execute(sql,{"empno":empno, "ename":ename, "deptno":deptno})
    conn.commit()
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.close()

def my_insert2(empno, ename=None, deptno=None): #추천

    sql = """insert
             into emp(empno, ename, deptno)
             values(:1, :2 , :3)"""#바인딩값 숫자로 표시

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.execute(sql,[empno, ename, deptno])
    #cur.execute(sql,{"empno":empno, "ename":ename, "deptno":deptno})
    conn.commit()
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.close()

def my_insert_many(emp_list):

    sql = """insert
             into emp(empno, ename, deptno)
             values(:1, :2 , :3)"""

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.executemany(sql, emp_list)
    conn.commit()
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.close()

def my_update(deptno,empno): #추천

    sql = """update emp
            set sal=sal+1000, deptno=:1
            where empno=:2"""#바인딩값 숫자로 표시

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.execute(sql,[deptno, empno])
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.commit()
    conn.close()
def my_update3(list): #추천

    sql = """update emp
            set sal=sal+1000, deptno=:1
            where empno=:2"""#바인딩값 숫자로 표시

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.executemany(sql,[list])
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.commit()
    conn.close()

##오라클상에서 데이터핸들링을 할때 커밋을 반드시 해주어야 파이썬에서 작동된다
def my_delete(deptno): #추천

    sql = """delete from emp
             where deptno=:1"""#바인딩값 숫자로 표시

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.execute(sql,[deptno])
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.commit()
    conn.close()
def my_delete2(empno1,empno2,empno3): #추천

    sql = """delete from emp
             where empno in (:1, :2, :3)"""#바인딩값 숫자로 표시

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.execute(sql,[empno1,empno2,empno3])
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.commit()
    conn.close()
def my_delete3(list): #추천

    sql = """delete from emp
             where empno =:1"""#바인딩값 숫자로 표시

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.executemany(sql,list)
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.commit()
    conn.close()

#---------------------------------------------------------------------

함수 Import 

from pkg import oracle_test

#oracle_test.my_select()
#oracle_test.my_select('KING')

# emp_list=[[551,'ccc1',10],[552,'ccc2',10],[553,'ccc3',10]]
#
# oracle_test.my_insert_many(emp_list)
#oracle_test.my_insert2('7775','ddd',20)
#oracle_test.my_update(20,7902)
#list=[30,7369]
#oracle_test.my_update3((list))
#oracle_test.my_delete2(552,553,7777)

List=[[9999],[7776],[7775]]
oracle_test.my_delete3(List)

 

퀴즈

#module name : lec10_oracle_file.py
#file name :lec10_oracle_file.txt
import cx_Oracle as cx


#quiz1. txt파일의 데이터를 오라클 emp2 테이블에 입력해라

def my_insert(empno, ename=None, job=None, mgr=None, hiredate=None, sal=None,comm=None,deptno=None):

    sql = """insert
             into emp2(empno, ename, job, mgr, hiredate, sal, comm, deptno)
             values(to_number(:1), :2 , :3, to_number(:4), to_date(:5,'yyyy-mm-dd'),
              to_number(:6), to_number(:7), to_number(:8))"""

    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")
    cur = conn.cursor()  # 커서로 데이터 접근가능
    cur.execute(sql,list2)
    #cur.execute(sql,{"empno":empno, "ename":ename, "deptno":deptno})
    conn.commit()
    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.close()

with open('./lec10_oracle_file.txt','r') as f:
    while True:
         line1 = f.readline()
         list2=line1.split("\t")
         x=list2[-1]
         x=x.replace('\n','')
         list2[-1]=x
         if len(line1)<=0:
             break
         my_insert(list2)



#quiz 2. dept 테이블 값을 읽어서 lec10_oracle_file.txt에 써라


def my_write(dept):
    conn = cx.connect("ai", "0000", "127.0.0.1:1521/XE")

    cur = conn.cursor()  # 커서로 데이터 접근가능

    sql = f"select * from {dept}"  # emp 데이터 가져와라 (SQL문)

    cur.execute(sql)


    with open('./lec10_oracle_file.txt', 'a') as w:
        for c in cur:  # 커서는 한줄씩 가져옴(for문을 통해서 전체 출력가능)
            for i in c:
                w.write(str(i))
                w.write(" ")
            w.write("\n")

    cur.close()  # 커넥션,커서 한번 열었으면 다시 닫아주기 연결 많아지면 오라클 서버 과부화
    conn.close()

my_write('dept')

 

-- excutemany excute 차이 복습