본문 바로가기
IT

오픈소스 큐브리드(CUBRID) 우분투 리눅스(Ubuntu Linux)에서 파이썬(python) 연동하기

by eddy's warehouse 2024. 3. 13.

지난 포스팅에서 국산 오픈소스 RDBMS인 큐브리드를 우분투 리눅스에 설치하고 데이터베이스 생성 및 사용자까지 만들어 보았습니다. 이번 시간에는 우분투 리눅스에서 cubrid를 파이썬 언어로 연동하는 법을 알아보도록 하겠습니다.

오픈소스 큐브리드(CUBRID) 우분투 리눅스에서 python 연동하기 썸네일

 

1. CUBRID unix용 ODBC 드라이버 미지원

처음에는 unixODBC를 이용해서 pyodbc를 연동하려고 했는데, cubrid가 unix용 odbc 드라이버를 지원하지 않기 때무

cubrid는 unix 환경에서 odbc 드라이버를 지원하지 않습니다.

CUBRID unix용 ODBC 드라이버 미지원 안내

2. CUBRID의 python 드라이버 다운로드

큐브리드 데이터베이스에 파이썬으로 개발을 하기 위해서는 python 드라이버를 설치해야합니다.

파이썬 드라이버를 설치하기 위해서는 먼저 다운로드를 받아야 하는데 아래 링크에서 다운받으실 수 있습니다.

CUBRID | 다운로드

 

위의 링크로 가서 아래로 조금 내리면 다음과 같은 화면에서 리눅스용 파이썬 드라이버의 소스를 다운받으실수 있습니다.

CUBRID의 python 드라이버 다운로드 화면

저의 경우 cubrid는 11.3 버전을 설치했는데, 파이썬 드라이버는 11.2가 최신인 것 같습니다. 아마도 호환성이 유지될 것으로 예상됩니다. 그러므로, 11.2를 다운받아서 테스트 해보겠습니다.

다운로드를 누르면 아래의 이름과 같은 파일이 다운받아집니다.

cubrid-python-11.2-latest.tar.gz

 

3. CUBRID의 python 드라이버 설치하기

큐브리드의 파이썬 드라이버를 설치하기 위해서 참고한 매뉴얼은 아래 링크에서 확인할 수 있습니다.

큐브리드 파이썬 드라이버 매뉴얼

이 글에서는 간략하게 제가 테스트하고 확인한 부분으로 설명드립니다.

먼저 cubrid의 파이썬 드라이버는 파이썬 2.4 이상에서 동작한다고 합니다. 제 우분투의 경우 아래와 같이 파이썬 3.10이 설치되어있습니다. 아마 대부분의 분들은 2.4는 넘을테니 파이썬이 설치되어있다면 버전은 신경안쓰셔도 될 것 같습니다.

~/cubrid-python$ python3 --version
Python 3.10.12

 

큐브리드 파이썬 드라이버 컴파일해서 설치하기

리눅스 드라이버는 다운로드 페이지에서 소스로만 제공하는데, 컴파일을 직접해야한다고 합니다.

 

이때 매뉴얼 상 다음과 같은 메시지가 있습니다.

"CCI 드라이버 빌드하기 위해 GNU Developer Toolset 8 또는 그 이상이 필요하다."

여기서 CCI는 큐브리드에서 사용하는 C Client Interface의 약자이고, GNU 개발 툴 킷 8이상이 있는지는 gcc의 버전을 확인해 보시면 됩니다.

~/cubrid-python$ gcc --version
gcc (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

위와같이 되어있는 경우 이제 다음 명령들을 순차적으로 실행하여 설치를 진행합니다. 라고 기록되어있으나.. 현재 정상 동작하지 않습니다.

 

1. 다음 명령어를 실행하여 원하는 위치에 다운로드한 파일의 압축을 해제

tar xvfz cubrid-python-11.2-latest.tar.gz

 

2. 압축을 해제한 디렉터리로 이동

cd RB-11.0.0

~/cubrid-python$ tar xvfz cubrid-python-11.2-latest.tar.gz
RB-11.2.0/
RB-11.2.0/CUBRIDdb/
RB-11.2.0/CUBRIDdb/FIELD_TYPE.py
RB-11.2.0/CUBRIDdb/__init__.py
RB-11.2.0/CUBRIDdb/connections.py
RB-11.2.0/CUBRIDdb/cursors.py
RB-11.2.0/HISTORY
RB-11.2.0/README.md
RB-11.2.0/README_django_cubrid.md
RB-11.2.0/VERSION
RB-11.2.0/_cubrid_exceptions.py
RB-11.2.0/build_cci.bat
RB-11.2.0/build_cci.sh
....
RB-11.2.0/tests2/run-test.py
RB-11.2.0/tests2/runtest.sh
~/cubrid-python$ cd RB-11.2.0/
~/cubrid-python/RB-11.2.0$ ls
CUBRIDdb  README.md                VERSION                build_cci.bat  cci-src        python_cubrid.c  release.sh  setup.py    setup_3.py  tests2
HISTORY   README_django_cubrid.md  _cubrid_exceptions.py  build_cci.sh   django_cubrid  python_cubrid.h  samples     setup_2.py  tests

 

3. 드라이버를 컴파일하여 빌드

이 단계와 다음 단계는 루트 사용자 계정으로 실행하거나 sudo로 수행하면 되는데, 이 단계에서 아래와 같이 에러가 발생합니다.

sudo python3 setup.py build
~/python_driver/RB-11.2.0$ sudo python3 setup.py build
[sudo] cubrid 암호:
<string>:2: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
build.sh: 48: typeset: not found
build.sh: 49: typeset: not found
build.sh: 50: typeset: not found
build.sh: 55: Syntax error: "(" unexpected
script_dir: /home/cubrid/python_driver/RB-11.2.0
CCI static lib not found. Exit.

 

위 에러는 cci_src 디렉토리 하위에 있는 build.sh이 bash가 아닌 다른 sh로 수행되어서 발생합니다. 그러므로 해당 디렉토리로 직접 이동하여 build를 bash로 수행해 줍니다.

cd cci_src
bash build.sh

bash build.sh을 수행하였을 때 큐브리드에서 말하는 CCI 가 build되는 것을 확인하였습니다.

~/python_driver/RB-11.2.0/cci-src$ bash build.sh

[2024-03-12 17:41:13] Entering target [build]
CMake Deprecation Warning at CMakeLists.txt:19 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.
  
  ....
  *** Summary ***
  Target [build]
  Version [11.2.0.0000]
  Build mode [x86_64/release]
    Configured with [ -DCMAKE_BUILD_TYPE=RelWithDebInfo]

 

위와 같이 먼저 cci-src를 bash로 build 하고난 후 다시 다음의 명령을 다시 실행합니다.

sudo python3 setup.py build

그럼 cci build시 에러가나지만 cci 라이브러리가 이미 만들어 졌기 때문에 다음 과정이 진행되어 명령어는 정상적으로 완료됩니다.

 

4. 빌드한 드라이버를 설치

아래 명령으로 빌드한 드라이버를 파이썬 디렉토리에 설치해 줍니다.

sudo python3 setup.py install

이 때에도 아래와 같이 에러가 나긴 하지만, 정상적으로 설치가 됩니다. 저 build.sh은 여전히 미스테리하네요.

0$ sudo python3 setup.py install
<string>:2: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
build.sh: 48: typeset: not found
build.sh: 49: typeset: not found
build.sh: 50: typeset: not found
build.sh: 55: Syntax error: "(" unexpected
script_dir: /home/cubrid/python_driver/RB-11.2.0
running install
running build
running build_py
running build_ext
running install_lib
creating /usr/local/lib/python3.10/dist-packages/django_cubrid
copying build/lib.linux-x86_64-3.10/django_cubrid/creation.py -> /usr/local/lib/python3.10/dist-packages/django_cubrid
copying build/lib.linux-x86_64-3.10/django_cubrid/client.py -> /usr/local/lib/python3.10/dist-packages/django_cubrid
copying build/lib.linux-x86_64-3.10/django_cubrid/base.py -> /usr/local/lib/python3.10/dist-packages/django_cubrid
copying build/lib.linux-x86_64-3.10/django_cubrid/__init__.py -> /usr/local/lib/python3.10/dist-packages/django_cubrid
copying build/lib.linux-x86_64-3.10/django_cubrid/compiler.py -> /usr/local/lib/python3.10/dist-packages/django_cubrid
copying build/lib.linux-x86_64-3.10/django_cubrid/introspection.py -> /usr/local/lib/python3.10/dist-packages/django_cubrid
copying build/lib.linux-x86_64-3.10/django_cubrid/validation.py -> /usr/local/lib/python3.10/dist-packages/django_cubrid
copying build/lib.linux-x86_64-3.10/django_cubrid/schema.py -> /usr/local/lib/python3.10/dist-packages/django_cubrid
creating /usr/local/lib/python3.10/dist-packages/CUBRIDdb
copying build/lib.linux-x86_64-3.10/CUBRIDdb/connections.py -> /usr/local/lib/python3.10/dist-packages/CUBRIDdb
copying build/lib.linux-x86_64-3.10/CUBRIDdb/FIELD_TYPE.py -> /usr/local/lib/python3.10/dist-packages/CUBRIDdb
copying build/lib.linux-x86_64-3.10/CUBRIDdb/__init__.py -> /usr/local/lib/python3.10/dist-packages/CUBRIDdb
copying build/lib.linux-x86_64-3.10/CUBRIDdb/cursors.py -> /usr/local/lib/python3.10/dist-packages/CUBRIDdb
copying build/lib.linux-x86_64-3.10/_cubrid.cpython-310-x86_64-linux-gnu.so -> /usr/local/lib/python3.10/dist-packages
byte-compiling /usr/local/lib/python3.10/dist-packages/django_cubrid/creation.py to creation.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/django_cubrid/client.py to client.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/django_cubrid/base.py to base.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/django_cubrid/__init__.py to __init__.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/django_cubrid/compiler.py to compiler.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/django_cubrid/introspection.py to introspection.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/django_cubrid/validation.py to validation.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/django_cubrid/schema.py to schema.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/CUBRIDdb/connections.py to connections.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/CUBRIDdb/FIELD_TYPE.py to FIELD_TYPE.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/CUBRIDdb/__init__.py to __init__.cpython-310.pyc
byte-compiling /usr/local/lib/python3.10/dist-packages/CUBRIDdb/cursors.py to cursors.cpython-310.pyc
running install_egg_info
Writing /usr/local/lib/python3.10/dist-packages/CUBRID_Python-11.2.0.0010.egg-info

pip를 통한 설치

큐브리드 매뉴얼에는 파이썬의 easy_install을 이용해서 설치하라고 되어있습니다.

easy_install 설명 내용

하지만, 파이썬의 easy_install은 저의 경우 써본적이 없습니다. 아마도 예전 버전의 pip 같은 개념 같습니다.

 

다른 설명을 찾을 수 없었으나 그냥 easy_install 대신에 pip로 바꿔서 실행해 봅니다.

아래와 같이 설치는 됩니다. 그런데, cubrid-python 9.3.0 버전인 것 같습니다.

$ pip install CUBRID-Python
Defaulting to user installation because normal site-packages is not writeable
Collecting CUBRID-Python
  Downloading cubrid-python-9.3.0.0002.tar.gz (1.0 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 7.6 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Discarding https://files.pythonhosted.org/packages/f3/ec/bb2d4fd4416eaba46932e3cb299dd5c85a12a81465446bdf5a3ff94daab7/cubrid-python-9.3.0.0002.tar.gz#sha256=6d5128e82cef6b415096861364ad1fd7868a182402c86fefba5285855272896b (from https://pypi.org/simple/cubrid-python/): Requested CUBRID-Python from https://files.pythonhosted.org/packages/f3/ec/bb2d4fd4416eaba46932e3cb299dd5c85a12a81465446bdf5a3ff94daab7/cubrid-python-9.3.0.0002.tar.gz#sha256=6d5128e82cef6b415096861364ad1fd7868a182402c86fefba5285855272896b has inconsistent version: filename has '9.3.0.2', but metadata has '9.3.0.1'
  Downloading cubrid-python-9.3.0.0001.tar.gz (1.0 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 8.4 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: CUBRID-Python
  Building wheel for CUBRID-Python (setup.py) ... done
  Created wheel for CUBRID-Python: filename=CUBRID_Python-9.3.0.1-cp310-cp310-linux_x86_64.whl size=638515 sha256=5f058361d2b80009fe3735a7d54d438a1c523f469965e1d9d6d427897c104312
  Stored in directory: /home/altibase/.cache/pip/wheels/72/88/7a/6e254c43e2f3c9e29249b74439bdbfb59018f99e734ef4e844
Successfully built CUBRID-Python
Installing collected packages: CUBRID-Python
Successfully installed CUBRID-Python-9.3.0.1

 

결국 버전이 낮은 9.3.0은 다음 명령을 수행하여 삭제하였습니다.

$ pip uninstall CUBRID-Python
Found existing installation: CUBRID-Python 9.3.0.1
Uninstalling CUBRID-Python-9.3.0.1:
  Would remove:
    /home/altibase/.local/lib/python3.10/site-packages/CUBRID_Python-9.3.0.1.dist-info/*
    /home/altibase/.local/lib/python3.10/site-packages/CUBRIDdb/*
    /home/altibase/.local/lib/python3.10/site-packages/_cubrid.cpython-310-x86_64-linux-gnu.so
Proceed (Y/n)? Y
  Successfully uninstalled CUBRID-Python-9.3.0.1

 

4. 파이썬으로 큐브리드 데이터베이스 접근하기

지금까지 열심히 파이썬 드라이버를 설치한 이유는 파이썬으로 큐브리드 데이터베이스에 접속하고 데이터 조작을 하기 위함이었습니다.

이제 예제를 통해서 접근해 보도록 하겠습니다.

 

테이블 생성

예제 프로그램을 만들기 전에 테이블을 생성합니다.

테이블 생성은 csql을 이용해서 dba 계정으로 실행합니다. -c 이후에 sql을 입력하여 바로 수행될 수 있도록 테이블을 생성하고 권한을 부여합니다.

$ csql -u tpcc -p tpcc -c "CREATE TABLE posts( id integer, title varchar(255), body string, last_updated timestamp );" tpcc
Execute OK. (0.010318 sec) Committed. (0.002333 sec)
$ csql -u tpcc -p tpcc -c "grant ALL PRIVILEGES on posts to public;" tpcc
Execute OK. (0.003520 sec) Committed. (0.002402 sec)

 

프로그램 작성

프로그램은 다음과 같이 cubrid 라이브러리를 import 한 후 접속하고 Insert 문을 실행합니다.

cubrid@altibase-KVM:~/python_driver/RB-11.2.0$ cat test.py
import CUBRIDdb

conn = CUBRIDdb.connect('CUBRID:localhost:33000:tpcc:::', 'dba', '')
cur = conn.cursor()
cur.execute("INSERT INTO posts (id, title, body, last_updated) VALUES (1, 'Title 1', 'Test body #1', CURRENT_TIMESTAMP)")
conn.commit()

 

실행결과 아래와 같이 CCI 에러로 CUBRID CAS(cubrid application server의 약어인거 같네요)에 연결할 수 없다고 나타납니다.

$ python3 test.py
Traceback (most recent call last):
  File "/home/cubrid/python_driver/RB-11.2.0/test.py", line 4, in <module>
    conn = CUBRIDdb.connect('CUBRID:localhost:33000:tpcc:::', 'dba', '')
  File "/home/cubrid/python_driver/RB-11.2.0/CUBRIDdb/__init__.py", line 61, in Connect
    return Connection(*args, **kwargs)
  File "/home/cubrid/python_driver/RB-11.2.0/CUBRIDdb/connections.py", line 22, in __init__
    self.connection = _cubrid.connect(*args, **kwargs2)
_cubrid.InterfaceError: (-20016, 'ERROR: CCI, -20016, Cannot connect to CUBRID CAS')

 

위의 에러가 나는 경우는 cubrid broker가 안 떠있는 경우 발생할 수 있다고 합니다.

아래 명령어를 통해 확인해보니, 역시 cubrid broker가 실행되고 있지 않습니다.

결론적으로 cubrid serivce start를 수행해서 cubrid 관련 서비스들이 시작되도록 해야합니다.

이 명령을 수행하면 cubrid broker가 시작된다는 메시지가 나타납니다.

cubrid:~/python_driver/RB-11.2.0$ cubrid broker status
@ cubrid broker status
++ cubrid broker is not running.

cubrid:~/python_driver/RB-11.2.0$ cubrid service start
@ cubrid master start
++ cubrid master start: success
@ cubrid broker start
++ cubrid broker start: success
@ cubrid manager server start
++ cubrid manager server start: success
cubrid:~/python_driver/RB-11.2.0$ cubrid service status
@ cubrid master status
++ cubrid master is running.
@ cubrid server status
@ cubrid javasp status
@ cubrid broker status
  NAME                   PID  PORT    AS   JQ                  TPS                  QPS   SELECT   INSERT   UPDATE   DELETE   OTHERS     LONG-T     LONG-Q         ERR-Q  UNIQUE-ERR-Q  #CONNECT   #REJECT
===========================================================================================================================================================================================================
* query_editor         702208 30000     5    0                    0                    0        0        0        0        0        0     0/60.0     0/60.0             0             0         0         0
* broker1              702219 33000     5    0                    0                    0        0        0        0        0        0     0/60.0     0/60.0             0             0         0         0
@ cubrid gateway status
++ cubrid gateway is not running.
@ cubrid manager server status
++ cubrid manager server is running.

 

자 이제 다시 테스트 프로그램인 test.py를 다음과 같이 실행시키면 아무 에러 없이 프로그램이 완료되며, 파이썬 프로그램에서 삽입한 레코드를 csql로 검색해 볼 수 있습니다.

~/python_driver/RB-11.2.0$ python3 test.py
cubrid:~/python_driver/RB-11.2.0$ csql -u tpcc -p tpcc -c "select * from posts" tpcc

=== <Result of SELECT Command in Line 1> ===

           id  title                 body                  last_updated
====================================================================================
            1  'Title 1'             'Test body #1'        03:04:19 PM 03/25/2024

1 row selected. (0.008357 sec) Committed. (0.000010 sec)

 

오늘은 큐브리드 파이썬 드라이버를 소스로부터 컴파일 해서 설치하는 법을 알아보았습니다.

설치 과정에서 일부 에러가 나기도 하였지만 어렵지 않게 해결할 수 있었습니다.

그리고, 파이썬 테스트 프로그램을 만들어서 테스트 데이터까지 입력하는 것을 확인해 보았습니다.

facebook twitter kakaoTalk kakaostory naver band shareLink