상세 컨텐츠

본문 제목

DB 서버에서 파이썬으로 DB2 데이터 활용하기

Db2 for i

by 아이구르미 2022. 11. 28. 13:29

본문

DB 서버에서 Python을 사용하기 위한 기본 패키지가 설치되어 있는지 확인합니다.

IBM i의 기본 관리 툴인 ACS (Access Client Solution)로 들어가서 Open Source Package Management 를 실행하면 Installed Packages 에 아래 항목들이 있는지 확인하고, 없으면 설치합니다.

  1. bash (Optional)
  2. python3
  3. python3-pip
  4. python3-ibm_db
  5. python3-itoolkit

SSH 터미널에서 Python 을 실행하기 위한 PATH 설정을 합니다.

ACS 의 SSH Terminal (또는 랩탑에서 SSH 세션을 지원하는 다른 툴을 사용해도 됩니다. 예: iTerm, Putty 등등) 을 실행하고 로그인합니다. 

$ touch $HOME/.bash_profile
$ setccsid 1208 $HOME/.bash_profile
$ echo 'PATH=/QOpenSys/pkgs/bin:$PATH' >> $HOME/.bash_profile
$ echo 'export PATH' >> $HOME/.bash_profile
$ cat .bash_profile
PATH=/QOpenSys/pkgs/bin:$PATH
export PATH

방금 만든 profile 정보가 잘 실행되는지 확인하기 위해 SSH Terminal 을 로그아웃한 다음, 다시 접속합니다. 

Python 가상 환경을 만듭니다. 아래 예시는 myvenv 라는 이름으로 현재 디렉토리에 가상환경을 만들고, 가상환경을 활성화하는 명령입니다.

$ bash
bash-5.1$ python3 -m venv --system-site-packages myvenv
bash-5.1$ source myvenv/bin/activate
(myvenv) bash-5.1$

다음에 재접속할 때는 파이썬 가상환경을 만드는 명령은 제외하고, 활성화하는 명령어만 실행하면 됩니다. (아래 참조)

$ bash
bash-5.1$ source myvenv/bin/activate

 

가상환경에서 새로운 파이썬 모듈을 설치해보겠습니다. PTable (Pretty Table)은 데이터를 조회할 때 결과를 테이블 형태로 예쁘게 보여주는 모듈입니다. 

(myvenv) bash-5.1$ pip3 install PTable
Collecting PTable
  Using cached PTable-0.9.2.tar.gz (31 kB)
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: PTable
  Building wheel for PTable (setup.py) ... done
  Created wheel for PTable: filename=PTable-0.9.2-py3-none-any.whl size=22925 sha256=7661c91ada777605f541fb2e3a8aae5ea3eb9ff37b8ed013f15081733d03b208
  Stored in directory: /home/user1/.cache/pip/wheels/b8/d5/8b/e0c9765594e0dc8093aae5f67eacc08b9b533da598c710b54a
Successfully built PTable
Installing collected packages: PTable
Successfully installed PTable-0.9.2
(myvenv) bash-5.1$

 

간단한 DB 를 조회하는 파이썬 프로그램을 작성하고 테스트해보겠습니다.

(myvenv) bash-5.1$ vim kpretty.py
from prettytable import from_db_cursor
import ibm_db_dbi as db2
 conn = db2.connect()
 cur = conn.cursor()
 cur.execute("select * from sampledb.employee")
     print(from_db_cursor(cur))
(myvenv) bash-5.1$ python3 kpretty.py
+--------+-----------+---------+------------+----------+---------+------------+----------+---------+-----+------------+----------+---------+---------+
| EMPNO  |  FIRSTNME | MIDINIT |  LASTNAME  | WORKDEPT | PHONENO |  HIREDATE  |   JOB    | EDLEVEL | SEX | BIRTHDATE  |  SALARY  |  BONUS  |   COMM  |
+--------+-----------+---------+------------+----------+---------+------------+----------+---------+-----+------------+----------+---------+---------+
| 000010 | CHRISTINE |    I    |    HAAS    |   A00    |   3978  | 1965-01-01 | PRES     |    18   |  F  | 1933-08-24 | 52750.00 | 1000.00 | 4220.00 |
| 000020 |  MICHAEL  |    L    |  THOMPSON  |   B01    |   3476  | 1973-10-10 | MANAGER  |    18   |  M  | 1948-02-02 | 41250.00 |  800.00 | 3300.00 |
| 000030 |   SALLY   |    A    |    KWAN    |   C01    |   4738  | 1975-04-05 | MANAGER  |    20   |  F  | 1941-05-11 | 38250.00 |  800.00 | 3060.00 |
| 000050 |    JOHN   |    B    |   GEYER    |   E01    |   6789  | 1949-08-17 | MANAGER  |    16   |  M  | 1925-09-15 | 40175.00 |  800.00 | 3214.00 |
| 000060 |   IRVING  |    F    |   STERN    |   D11    |   6423  | 1973-09-14 | MANAGER  |    16   |  M  | 1945-07-07 | 32250.00 |  500.00 | 2580.00 |
| 000070 |    EVA    |    D    |  PULASKI   |   D21    |   7831  | 1980-09-30 | MANAGER  |    16   |  F  | 1953-05-26 | 36170.00 |  700.00 | 2893.00 |

 

한글 테이블로 다시 테스트해보겠습니다.

 

 

이번에는 액셀 시트로 변환해줄 수 있는 파이썬 모듈을 설치해서 테스트해보겠습니다.

(myvenv) bash-5.1$ pip3 install xlsxwriter
Collecting xlsxwriter
  Downloading XlsxWriter-3.0.3-py3-none-any.whl (149 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 150.0/150.0 KB 144.9 kB/s eta 0:00:00
Installing collected packages: xlsxwriter
Successfully installed xlsxwriter-3.0.3

 

테스트할 파이썬 코드는 다음과 같습니다. 테이블의 데이터를 가져와 Worldcup_Rank.xlsx 라는 이름의 액셀 시트로 변환하는 내용입니다.

from xlsxwriter import Workbook
import ibm_db_dbi as db2

cur = db2.connect().cursor()
cur.execute("select W_YEAR, W_RANK, W_COUNTRY, W_COUNTRY_ENG, W_GROUP FROM SAMPLEDB.WORLDCUP_RANK")

headers = [desc[0] for desc in cur.description]

with Workbook('Worldcup_Rank.xlsx') as workbook:
    ws = workbook.add_worksheet()
    ws.write_row('A1', headers)
    for row, data in enumerate(cur, start=1):
        ws.write_row(row, 0, data)
(myvenv) bash-5.1$ python3 db2i-to-excel.py
(myvenv) bash-5.1$ ls -al *.xlsx
-rw-r--r-- 1 user1 0 5785 Nov 28 13:11 Worldcup_Rank.xlsx
-rw-r--r-- 1 user1 0 6935 Nov 28 12:07 newexcel.xlsx

 

이제 ACS의 Integrated File System 을 열어서 생성된 액셀 파일을 다운로드 받아서 열어보면, 액셀로 잘 생성되어 있는 것을 볼 수 있습니다.

 

 

[ 테스트 환경 정보 ]

  • OS/DB2 버전 : IBM i V7R2 TR9
  • Python 버전 : 3.9.11
  • Python ibm_db 모듈 버전 : 2.0.5.12
  • Python itoolkit 버전 : 1.7.0
  • bash 버전 : 5.1

관련글 더보기

댓글 영역