오늘은 Python에서 SAPDBAPI를 이용해서 SAPDB에 접근해 보기로 하자
SAPDBAPI는 제공되는 Python Interfaces 중 Python DB API 2.0에 근거하여 만들어진 모듈이다.
이것을 이용할 경우 다른 DB로의 전환이 용이하고 또한 같은 형태로 코딩이 가능하기 때문에 재사용성이 극대화된다.
그럼 이제 알아보도록 하자.
※ Python 소스 중간중간에 나오는 ____ 는 모두 스페이스로 대치하기 바란다. 그렇지 않으면 에러가 발생한다
우선 sapdbapi에는 몇가지의 Object가 들어있다
첫번째 Object는 Connection 오브젝트이다.
Connection 오브젝트는 sapdbapi.Connection 혹은 sapdbapi.connect 를 통해서 얻을 수 있다
두 메소드 모두 4개의 인자값을 필요로 하는데 차례대로 사용자명, 패스워드, DB명, 서버명 이다. 로컬 서버일 경우 서버명은 생략 가능하다
아래의 간단한 예를 보자
import sapdbapi
conn = sapdbapi.connect('TEST', 'TEST', 'TST')
conn.close()
위의 예제는 Connection Object를 생성해서 서버에 접속한후 연결을 해제하는 간단한 예제이다
Connection Object에는 아래와 같은 메소드들이 있다
close
- 접속을 해제한다
commit
- 트랜잭션을 commit 한다
rollback
- 트랜잭션을 roolback 시킨다
cursor
- cursor Object를 생성한다. 이것을 통해서 우리는 DB에 쿼리를 전송할 수 있다
자 그럼 이제 cursor Object를 통해서 직접 쿼리를 실행시켜보도록 하자
다음 예제를 보자
간단한 예제라 보면 바로 알수 있을 것이다
Exam1)
import sapdbapi
conn = sapdbapi.connect('TEST', 'TEST', 'TST')
cursor = conn.cursor()
result = cursor.execute('select * from users')
row = result.fetchone()
while row:
____print row
____row = result.fetchone()
result.close()
cursor.close()
conn.close()
Exam2)
import sapdbapi
conn = sapdbapi.connect('TEST', 'TEST', 'TST')
cursor = conn.cursor()
result = cursor.execute('select * from users')
row = result.fetchall()
print row
result.close()
cursor.close()
conn.close()
Exam3)
import sapdbapi
conn = sapdbapi.connect('TEST', 'TEST', 'TST')
cursor = conn.cursor()
result = cursor.execute('select * from users')
row = result.fetchmany(2)
print row
row = result.fetchmany(2)
print row
result.close()
cursor.close()
conn.close()
cursor Object는 많은 메소드를 가지고 있는데 중요 메소드만 알아보도록 하자
close
- cursor Object를 해제한다
execute
- 쿼리를 실행한다
fetchone
- 쿼리의 결과값 Row 하나를 읽어온다
fetchmany
- 쿼리의 결과값 임의의 수를 읽어온다
fetchall
- 쿼리의 결과값을 모두 읽어온다
위의 내용정도면 간단한 프로그램 정도는 작성할 수 있을 것이다
Python DB API 2.0에 대해 더 자세히 알고 싶으면 http://www.python.org/topics/database/DatabaseAPI-2.0.html 를 참고하기 바란다
※ 위의 예제들을 실행해보면 종료시점에서
Exception sapdbapi.OperationalError: <sapdbapi.OperationalError instance at 0x81598fc> in <bound method Connection.close of <sapdbapi.Connection instance at 0x815204c>> ignored
와 비슷한 예외가 발생할 것이다.
추측하건데 아무래도 conn.close() 메소드 호출후 프로그램이 종료시 다시 Connection의 close 메소드를 호출하는 듯 하다.
해결하는 방법은 그냥 conn.close() 부분을 주석처리해도 될 듯 하다.
|