CP4DのWatson Studio NotebookからJayDeBeApiでDb2 for iに接続

CP4DのでWatson Studio NotebookからJayDeBeApiでDb2 for iに接続する方法を説明します。

Db2 LUW版は既にWatson Studio Notebook環境にあるibm_dbライブラリでアクセスすることができます。ibm_dbライブラリでDb2 for iにアクセスするには、 [IBM Db2 Connect](https://www.ibm.com/products/db2-connect/)のライセンスが必要で、これをどうにかWatson Studio Notebook環境に適用したかったのですが、いろいろやってみましたがうまくいきませんでした。

よってibm_dbライブラリは使用せず、別のライブラリでpythonからJDBCでDb2に接続できるライブラリ[JayDeBeApi](https://github.com/baztian/jaydebeapi)を使用して接続する方法を今回は説明します。

なお、@tom_m_mさんの[IBMi上のDBをJayDeBeApi使ってpython+JDBCでつついてみる](https://qiita.com/tom_m_m/items/f3eee88e63c5a5be61b1)を参考にさせていただきました。違いはドライバ入手先と、WatsonStudio Notebook環境用にドライバーファイル指定方法、db名指定、pandasでアクセスしている点あたりです。

# 0. 前準備
あらかじめCP4DのWatsonStudio上でNotebookを開いておいてください。
尚、完成版のnotebookは以下においていますので、
https://github.com/kyokonishito/notebooks/blob/main/cp4d_db2i_JayDeBeApi.ipynb
こちらから「URLから作成」でNotebookを作成も可能です。

# 1. Db2 for i JDBCドライバ　jt400.jar　の入手
こちらIBM i上にもあるらしいですが、オープンソース版があるそうですので、そちらを入手してみます。
[IBM Toolbox for Java](https://www.ibm.com/docs/en/i/7.5?topic=java-toolbox)の中にあるそうです。
で、このオーブンソース版が[JTOpen](https://jt400.sourceforge.net/)とのことです。

ここからIBM Toolbox for Javaのzipファイルを入手し、JDBCドライバ　jt400.jarを取り出します。
以下のコードはversion 11.1をダウンロードします。

Notebookのセルに以下をコピペし実行します：

```python
vesion = "11.1"

zip_file = "jtopen_{0}.zip".format(vesion.replace('.', '_'))

# ダウンロードURLの作成
download_url = "https://sourceforge.net/projects/jt400/files/JTOpen-full/{0}/{1}/download/".format( vesion, zip_file)
print(download_url)

# ダウンロード
!wget -nc --content-disposition {download_url}

#  jt400.jarのみcurrent dirに解凍
!unzip -p {zip_file}  lib/jt400.jar > jt400.jar

# 確認
!ls -la
```

出力サンプル:
```shell
https://sourceforge.net/projects/jt400/files/JTOpen-full/11.1/jtopen_11_1.zip/download/
--2023-01-16 06:26:35--  https://sourceforge.net/projects/jt400/files/JTOpen-full/11.1/jtopen_11_1.zip/download/
Resolving sourceforge.net (sourceforge.net)... 104.18.10.128, 104.18.11.128, 2606:4700::6812:a80, ...
Connecting to sourceforge.net (sourceforge.net)|104.18.10.128|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://sourceforge.net/projects/jt400/files/JTOpen-full/11.1/jtopen_11_1.zip/download [following]
--2023-01-16 06:26:35--  https://sourceforge.net/projects/jt400/files/JTOpen-full/11.1/jtopen_11_1.zip/download
Reusing existing connection to sourceforge.net:443.
HTTP request sent, awaiting response... 302 Found
Location: https://downloads.sourceforge.net/project/jt400/JTOpen-full/11.1/jtopen_11_1.zip?ts=gAAAAABjxO4cHljOYOfCcUdK4zCMX0clfDKwJKqGl6lK2ozEqJCsJkMktMG0lvLk3vakOiI6r1-XkNqTUdo8PbVVv1WDlZwvdw%3D%3D&use_mirror=versaweb&r= [following]
--2023-01-16 06:26:36--  https://downloads.sourceforge.net/project/jt400/JTOpen-full/11.1/jtopen_11_1.zip?ts=gAAAAABjxO4cHljOYOfCcUdK4zCMX0clfDKwJKqGl6lK2ozEqJCsJkMktMG0lvLk3vakOiI6r1-XkNqTUdo8PbVVv1WDlZwvdw%3D%3D&use_mirror=versaweb&r=
Resolving downloads.sourceforge.net (downloads.sourceforge.net)... 204.68.111.105
Connecting to downloads.sourceforge.net (downloads.sourceforge.net)|204.68.111.105|:443... connected.
HTTP request sent, awaiting response... 302 Found
total 40652
drwxr-x---. 3 1000690000 wscommon     4096 Jan 16 06:24 .
drwxrwx---. 1 wsuser     wsbuild      4096 Jan 16 06:08 ..
-rw-rw----. 1 1000690000 wscommon  5629275 Jan 16 06:26 jt400.jar
-rw-rw----. 1 1000690000 wscommon 35972805 Nov 24 07:23 jtopen_11_1.zip
drwxr-x---. 2 1000690000 wscommon     4096 Jan 16 02:55 .virtual_documents
```

`jt400.jar` が　notebookの仮想マシン上にsave出来ました！


# 2. JayDeBeApiのインストール
pipで[JayDeBeApi](https://github.com/baztian/jaydebeapi)をインストールします。

Notebookにセルを追加し、以下をコピペし実行します：
```python
!pip install JayDeBeApi
```

# 3. Db2 for iに接続

## 3.1 接続情報をセット
Notebookにセルを追加し、以下をコピペし、自分のDbの接続情報に上書きした上で実行します：
```python
dbname = 'IBMIxxxx'
host='xxx.xx.xx.xxx'
port='xxx'
uid='xxxxxx'
pwd='xxxxxxxx'
```

## 3.2 Db2へ接続
Notebookにセルを追加し、以下をコピペし実行します：
```python
import jaydebeapi

conn = jaydebeapi.connect("com.ibm.as400.access.AS400JDBCDriver",
                          "jdbc:as400://{0}/{1}".format(host, dbname), 
                          ["{0}".format(uid), "{0}".format(pwd)], 
                          "./jt400.jar",)
```

最後の引数でダウンロードしたドライバーファイルを指定しています。
特にエラーがなければ接続成功です!


# 4. テーブルの中身の確認
pandasでテーブルの中身を確認してみます。

Notebookにセルを追加し、以下をコピペし、自分のDbで実行可能なSQLに上書きした上で実行します：

```python
import pandas as pd

# 以下を自分のDbで実行可能なSQLに上書き
sql = "select * from SAMPLE.TABLE_A fetch first 100 rows only" 

# queryの実行、結果の表示
df = pd.read_sql(sql, conn)
df
```

結果が表示されればOKです。


# 5. Db接続のCLOSE
Notebookにセルを追加し、以下をコピペし実行します：
```python
conn.close()
```
以上です。