본문 바로가기
AI 이론과 개발의 혼재/Python

Python - DB2 연동 (라이브러리 설치, CRUD 테스트)

by ministar 2020. 4. 23.

IBM에서 제공하는 DB2와 python 연동을 하려고 하는데,
왜 이렇게 reference가 부실한 것인지.. ^_ㅠ 좀 정리좀 해둬야겠다.

1. 라이브러리 설치

pip install ibm_db


설치가 제대로 되었는지는, python에서 import ibm_db 를 실행했을 때 문제가 없으면 잘 설치 되었다는 것^_^

 

2. DB Connection 설정

파이썬에서, DB 접속을 가능하게 하기 위해서는 DB Connection 을 설정해주어야 합니다.

Python - DB2 Connection

IBM에서 일반적으로 2개의 connection 방법을 제공한다.

"persistent connection vs. non- persistent connection"

비지속 연결(non-persistent connection)은 매번 자원을 요청할 때 새로운 TCP Connection을 생성하는 것이고,
지속 연결(persistent connection)은 하나의 TCP Connection을 생성하고 그 연결을 통해 모든 요청을 처리하는 것이다.

뭐, 간단하게는 요청이 자주 들어오면 지속 연결이 좋겠으나,
secure 측면에서 자주 요청이 없을 경우에는 비지속 연결형이 더 낫지 않을까 하는 생각이 든다. 흠흠~

import ibm_db 

#connect to a local or cataloged DB 
# 1) non-persistent connection 

conn = ibm_db.connect("database", "username", "password") 

# 2) persistent connection 
pconn = ibm_db.pconnect("database", "username", "password") 

#connect to an uncataloged DB 
conn = ibm_db.connect("DATABASE=name; HOSTNAME=host; PORT=60000; PROTOCOL=TCPIP; UID=username; PWD=password;" , "", "")

 

3. CRUD 등의 SQL 문 실행

 

- INSERT 문

conn = ibm_db.connect(f"DATABASE={DATABASE}; HOSTNAME={HOSTNAME};PORT={PORT};PROTOCOL=TCPIP;UID={USER_NAME};PWD={PASSWORD};", "", "")

try : 
	#SQL 문 작성
	sql = "INSERT INTO survey_resp_cantrl (survey_no,email ,value_type, value) VALUES(?,?,?,?);"
	stmt = ibm_db.prepare(conn, sql)
	param = {VALUE1}, {VALUE2}, {VALUE3}, {VALUE4}
	ibm_db.execute(stmt, param)
except : 
    print(f'error occured. {ibm_db.stmt_errormsg()}')
finally : 
    conn.close()

 

 

SELECT문 

conn = ibm_db.connect(f"DATABASE={DATABASE}; HOSTNAME={HOSTNAME};PORT={PORT};PROTOCOL=TCPIP;
		UID={USER_NAME};PWD={PASSWORD};", "", "") 
        
def select_all(): 
'''select multiple rows ''' 
	sql = 'SELECT * FROM table' 
    try : 
    	stmt = ibm_db.exec_immediate(conn, sql) 
        row = ibm_db.fet_assoc(stmt) 
        while row : 
        	print(row) 
            row = ibm_db.fetch_assoc(stmt) 
    except : print(f'error occured. {ibm_db.stmt_errormsg()}') 
    finally : 
    	conn.close() 
        
def select_specific(condition): 
'''select row where condition = condition''' 
#using prepared-statement! 
	sql = 'SELECT * FROM table WHERE condition = ? ' 
    try : 
    	stmt = ibm_db.prepare(conn, sql) 
        # option 1 : Explicitly bind parameters 
        ibm_db.bind_param(stmt, 1, condition) 
        ibm_db.execute(stmt) 
        
        # option 2 : Invoke Prepared Statement again using dynamically bound parameters. 
        param = condition 
        ibm_db.execute(stmt, param) 
    except : print(f'error occured. {ibm_db.stmt_errormsg()}') 
    finally : 
    	conn.close()



 

 

댓글