Python/Python기초

Python 35_ Database 4 데이터 바인딩 Data Binding

Codezoy 2020. 1. 8. 18:55


"""
oracle_config.py
Oracle 데이터베이스 서버에 접속(로그인)하기 위해 필요한 정보들을 정의
"""


     # 사용자 이름
     user = 'scott'

     # 비밀번호
     pwd = 'tiger'

     # 데이터베이스 서버 주소: DSN(Data Source Name)
     dsn = 'localhost:1521/orcl'



>>Oracle 데이터베이스 서버에서 select 구문 실행, 결과 확인
현재 프로젝트 디렉토리 상태


# 사용자가 입력한 문자열에 따옴표(')나 큰따옴표(")가 포함되어 있는 경우
# SQL 에러가 발생할 수 있으므로 권장되지 않음.
# -> Data Binding 방법을 권장.

import cx_Oracle
import lec08_database.oracle_config as cfg

with cx_Oracle.connect(cfg.user, cfg.pwd, cfg.dsn) as connection:
     with connection.cursor() as cursor:
          deptno = int(input('부서 번호 입력>> '))
          dname = input('부서 이름 입력>> ')
          loc = input('부서 위치 입력>> ')



데이터 바인딩은 파이썬의 언어가 아닌 다른 언어의 방식으로 값을 삽입하는 것으로, DB  프로그램에 따라 조금씩 차이가 있다.
Oracle DB의 경우 콜론 ':' 을 사용한다.

방법 1
        sql1 = 'insert into dept2 values (:0, :1, :2)' # 컬럼 index [0], [1], [2]
        cursor.execute(sql1, [deptno, dname, loc]) # >> data binding
        connection.commit()


방법 2
        sql2 = 'insert into dept2 values (:dept_no, :dept_name, :loc)'
        cursor.execute(sql2, dept_no = deptno, dept_name = dname, loc = loc)
        connection.commit()


exercise)
수정할 deptno, 수정할 loc를 입력받아서 loc만 변경 update
import cx_Oracle
import lec08_database.oracle_config as cfg

with cx_Oracle.connect(cfg.user, cfg.pwd, cfg.dsn) as connection:
     with connection.cursor() as cursor:
          deptno = int(input('변경된 부서번호 입력: '))
          loc = input('변경된 부서 위치 입력 :')
          adjust_query = 'update dept2 set loc = :ad_loc where deptno = :ad_deptno'
          cursor.execute(adjust_query, ad_loc = loc, ad_deptno = deptno)
          connection.commit()


1) emp 테이블에서 부서번호를 입력 받아서 해당 부서의 사번, 이름, 부서번호 출력
2) emp 테이블에서 이름을 입력 받아서, 해당 글자가 포함된 직원들의 사번, 이름, 급여를 출력

with cx_Oracle.connect(cfg.user, cfg.pwd, cfg.dsn) as connection:
     with connection.cursor() as cursor:
          deptno = int(input('부서 번호 입력>> '))
          sql1 = 'select empno, ename, deptno from emp where deptno = :p_deptno'
          cursor.execute(sql1, p_deptno=deptno)
          connection.commit()
          for empno, ename, deptno in cursor:
               print(empno, ename, deptno)

with cx_Oracle.connect(cfg.user, cfg.pwd, cfg.dsn) as connection:
     with connection.cursor() as cursor:
          ename = '%'+input('사원 이름을 입력>> ')+'%'
          sql2 = "select empno, ename, sal from emp where upper(ename) like upper(:p_ename)"
          cursor.execute(sql2, p_ename=ename)
          for empno, ename, sal in cursor:
               print(empno, ename, sal)