IBM i上のデータをPythonで取り出せないか
ひょんなことから、IBM i (AS400とも呼ばれたOSです) のデータを取り出す必要に迫られました。
やりたいこと
IBM i上のデータを取り出して、LinuxとかWindowsで使いたい
システム内のデータを使って、機械学習だったり分析だったりをしたいと思うことがあります。
単純にPythonを使うだけなら、IBM i上で処理することもできます。
が、今回はGPU使ってDLだったりMLしたいので、Linux上にデータを持ってくる必要があります。
そのために、JDBC+Pythonでデータを引っ張ってこようと思います。
もちろん、Javaを使ってデータを取ってきてもよいです。
今回はPythonの方が得意という理由でPythonからJDBCを使うことにしました。
(DLやMLはPythonで書くことが多いので、その処理にも入れやすかも)
JayDeBeApiを使ってみる
今回は、JDBCのAPIを叩くためのPythonライブラリとして、JayDeBeApi
を使います。
https://github.com/baztian/jaydebeapi
結構いろんな種類のDBに対応しています。
DB2もありますね!
Supported databases
In theory every database with a suitable JDBC driver should work. It is confirmed to work with the following databases:
SQLite
Hypersonic SQL (HSQLDB)
IBM DB2
IBM DB2 for mainframes
Oracle
Teradata DB
Netezza
Mimer DB
Microsoft SQL Server
MySQL
PostgreSQL
many more...
準備
今回は、Python3.6で動かします。
各ソフトウェアのバージョンは以下の通り
- Python == 3.6
- JayDeBeApi == 1.1.1
- JPype1 == 0.6.3
インストール
pipでインストールできます。
pip install JayDeBeApi
JPypeのバージョンが最新だと、実行時にエラーが発生したので、0.6.3で再インストールしました。
pip install JPype1==0.6.3 --force-reinstall
JDBCドライバーの準備
今回はIBM iに標準で用意されているJarファイルを利用します。
jt400.jar
が下記のディレクトリに格納されているので、IBM iから利用するLinux環境にコピーします。
/QIBM/ProdData/HTTP/Public/jt400/lib/jt400.jar
簡単なデータ取得
<hostname>
, <user>
, <password>
はお使いの環境に合わせて設定してください。
import jaydebeapi
conn = jaydebeapi.connect("com.ibm.as400.access.AS400JDBCDriver", "jdbc:as400://<hostname>", ["<user>", "<password>"], "/home/IBMi/jt400.jar",)
cur = conn.cursor()
cur.execute("select * from TSLIB.WORKDAY")
cur.fetchall()
curs.close()
conn.close()
このPythonスクリプトを実行することで、IBM iからデータを取得できました。
execute
のSQL文を変更することで、DBに対する操作も変えられます。