Ubuntu+Tibero+Python3+ODBC 연결하기

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

답글 남기기

Your email address will not be published.