CP4DのでWatson Studio NotebookからJayDeBeApiでDb2 for iに接続する方法を説明します。
Db2 LUW版は既にWatson Studio Notebook環境にあるibm_dbライブラリでアクセスすることができます。ibm_dbライブラリでDb2 for iにアクセスするには、 IBM Db2 Connectのライセンスが必要で、これをどうにかWatson Studio Notebook環境に適用したかったのですが、いろいろやってみましたがうまくいきませんでした。
よってibm_dbライブラリは使用せず、別のライブラリでpythonからJDBCでDb2に接続できるライブラリJayDeBeApiを使用して接続する方法を今回は説明します。
なお、@tom_m_mさんのIBMi上のDBをJayDeBeApi使ってpython+JDBCでつついてみるを参考にさせていただきました。違いはドライバ入手先と、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の中にあるそうです。
で、このオーブンソース版がJTOpenとのことです。
ここからIBM Toolbox for Javaのzipファイルを入手し、JDBCドライバ jt400.jarを取り出します。
以下のコードはversion 11.1をダウンロードします。
Notebookのセルに以下をコピペし実行します:
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
出力サンプル:
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をインストールします。
Notebookにセルを追加し、以下をコピペし実行します:
!pip install JayDeBeApi
3. Db2 for iに接続
3.1 接続情報をセット
Notebookにセルを追加し、以下をコピペし、自分のDbの接続情報に上書きした上で実行します:
dbname = 'IBMIxxxx'
host='xxx.xx.xx.xxx'
port='xxx'
uid='xxxxxx'
pwd='xxxxxxxx'
3.2 Db2へ接続
Notebookにセルを追加し、以下をコピペし実行します:
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に上書きした上で実行します:
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にセルを追加し、以下をコピペし実行します:
conn.close()
以上です。