Ubuntu 18.04에서 python3과 tibero 데이타베이스 연동하기
Tibero는 python 드라이버를 지원하지 않으므로, ODBC를 통해서 연결해야한다.
우분투리눅스에 ODBC를 아래 명령어로 설치한다.
# sudo apt install build-essential # sudo apt install libssl-dev python3-dev # sudo apt install unixodbc unixodbc-dev
tibero odbc 드라이버를 설치하려면 tibero client를 설치해야하지만, 티베로 데이타베이스서버에서 아래 파일만 복사하여 사용할 수도 있다.
여기서는 tibero 서버에서 libtbodbc.so 파일을 가져와서 /home/tibero/client/ 에 설치했다.
$ ls -l -rwxr-xr-x 1 tibero dba 32171678 Aug 12 13:38 libtbodbc.so
/etc/odbcinst.ini 파일에 ODBC 드라이버 이름을 설정한다. 여기서는 Tibero6이 드라이버 이름이다.
# cat /etc/odbcinst.ini [Tibero6] Description = Tibero6 ODBC driver Driver = /home/tibero/client/libtbodbc.so Setup = /home/tibero/client/libtbodbc.so Setup = 1 FileUsage = 1
MYCODE 라는 이름으로 ODBC를 설정한다. 이후 ODBC 접속은 MYCODE라는 DSN을 사용하게 된다.(아래 파이썬 코드 참고)
# cat /etc/odbc.ini [ODBC] Trace = 1 TraceFile = /tmp/odbc.trace [MYCODE] Trace = no Driver = Tibero6 Description = Tibero6 ODBC Datasource # ConnectionType = Direct SERVER = 192.168.100.41 PORT = 8629 # AuthenticationType=No Authentication SID = tibero User = tiberotest Password = tiberotest Database = tibero
이제 설정한 ODBC에 잘 접속이 되는지 시험해 본다. 이때, isql 명령을 사용한다.
$ isql MYCODE +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> select * from test; +------------------------------------------------------+ | IDX | +------------------------------------------------------+ | 13 | | 12 | | 14 | +------------------------------------------------------+ SQLRowCount returns 3 3 rows fetched SQL> exit
접속이 잘 되므로 python 스크립트를 작성한다.
$ vi test_tibero_odbc.py import pyodbc try: user = 'tiberotest' passwd = 'tiberotest' sql = 'select * from test;' conn = pyodbc.connect('DSN=MYCODE;UID='+user+';PWD='+passwd) curs = conn.cursor() row = curs.execute(sql) for i in row: print(i[0]) conn.close() except Exception as ex: print(ex)
파이썬 스크립트를 실행하니 아래와 같은 오류가 발생했다.
$ python test_tibero_odbc.py Traceback (most recent call last): File "test_tibero_odbc.py", line 8, in <module> cursor.execute(query) pyodbc.Error: ('ERRPS', '[ERRPS] PSM compilation error. (-15146) (SQLExecDirectW)')
위 에러는 티베로 데이타베이스 오류로, 인코딩 관련 문제다. 위 코드를 아래처럼 수정하면 이상없이 잘 작동한다.
import pyodbc try: user = 'm_qr' passwd = 'm_qr123!' sql = 'select * from test;' conn = pyodbc.connect('DSN=QRCODE;UID='+user+';PWD='+passwd) conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') conn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8') conn.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-32le') conn.setencoding(encoding='utf-8') curs = conn.cursor() row = curs.execute(sql) for i in row: print(i[0]) conn.close() except Exception as ex: print(ex)
이제 파이썬 코드를 실행하면, 아래처럼 테이블 결과를 읽어온다.
$ python test_tibero_odbc.py python tiberodbc.py 13.0 12.0 14.0
— 추가 —
좀 편리하게 사용하려면 아래 글의 클래스를 이용하면 되며, 윈도우에서는 인코딩 부분이 필요 없으나, 리눅스에서는 인코딩 부분이 꼭 필요하다.
아래글은 티베로 연결에 사용했던 코드다.
https://blog.boxcorea.com/wp/archives/2938