Mapepire の登場
IBM i の Db2 for i 向けに新たなデータベースクライアントが2024年8月から提供されています。
https://mapepire-ibmi.github.io/
Mapepire は、"マパピー" と発音するようです。
公式には、「mapəpɪə」または「MAH-pup-ee」と発音とのこと。
これまでは、ODBCやJDBCといったデータベースドライバーを使用していました。
Mapepireを発表したブログでは、JTOpenやODBCといった従来のクライアントについて下記のように記述しています。
- CCSIDの処理を内部で行っており、コード量が多く複雑
- プロトコル仕様が非公開または不十分
- 新しい言語でクライアントを実装するにはリバースエンジニアリングが必要
Mapepireでは、ほぼ全てがオープンソースで構成されており、サーバーにエンコーディングやパスワードレベルの処理を任せることで、クライアントの軽量化を実現しているとのことです。
これにより、より多くの言語、プラットフォームで動作する新しいアプリケーションをより簡単に作成できるようになるとのこと。
それでは、実際の利用方法を見ていきましょう。
サーバー準備
Mapepireは、IBM i 上に yum を利用することでインストールできます。
Mapepireのパッケージがインストールできることが確認できます。
~ # yum search mapepire
ibmi-base | 3.6 kB 00:00:00
ibmi-base/primary_db | 474 kB 00:00:01
ibmi-release | 2.9 kB 00:00:00
====================================== N/S Matched: mapepire =======================================
mapepire-server.noarch : Cloud-native database access server for IBM i
インストールは、yum install mapepire-server
で実行可能です。
~ # yum install mapepire-server
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mapepire-server.noarch 0:2.3.2-1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
====================================================================================================
Package Arch Version Repository Size
====================================================================================================
Installing:
mapepire-server noarch 2.3.2-1 ibmi-base 3.5 M
Transaction Summary
====================================================================================================
Upgrade 1 Package
Total download size: 3.5 M
Is this ok [y/N]: y
Downloading Packages:
mapepire-server-2.3.2-1.ibmi7.3.noarch.rpm | 3.5 MB 00:00:02
Running Transaction Check
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : mapepire-server-2.3.2-1.noarch 1/1
Installed:
mapepire-server.noarch 0:2.3.2-1
Complete!
インストールが完了したら、Service Commander sc
を使用してサーバーを起動します。
sc start mapepire
で起動します。
~ # sc start mapepire
Performing operation 'START' on service 'mapepire'
Service 'Mapepire Server' successfully started
このscコマンドは、Mapepireだけでなく他の用途もあるのですが、今回はMapepire Serverの起動用コマンドとしておきます。
scコマンドのオプションは、以下のようになっています。
~ # sc -h
Usage: sc [options] <operation> <service>
Valid options include:
-v: verbose mode
-q: quiet mode (suppress warnings). Ignored when '-v' is specified
--disable-colors: disable colored output
--splf: send output to *SPLF when submitting jobs to batch (instead of log)
--sampletime=x.x: sampling time(s) when gathering performance info (default is 1)
--ignore-globals: ignore globally-configured services
--ignore-groups=x,y,z: ignore services in the specified groups (default is 'system')
--all/-a: don't ignore any services. Overrides --ignore-globals and --ignore-groups
Valid operations include:
start: start the service (and any dependencies)
stop: stop the service (and dependent services)
kill: stop the service (and dependent services) forcefully
restart: restart the service
check: check status of the service
info: print configuration info about the service
jobinfo: print basic performance info about the service
perfinfo: print basic performance info about the service
loginfo: get log file info for the service (if running)
list: print service short name and friendly name
groups: print an overview of all groups
Valid formats of the <service(s)> specifier include:
- the short name of a configured service
- A special value of "all" to represent all configured services (same as "group:all")
- A group identifier (e.g. "group:groupname")
- the path to a YAML file with a service configuration
- An ad hoc service specification by port (for instance, "port:8080")
- An ad hoc service specification by job name (for instance, "job:ZOOKEEPER")
- An ad hoc service specification by subsystem and job name (for instance, "job:QHTTPSVR/ADMIN2")
これで、サーバー側の設定は完了しました。
クライアントの実装
現在、Python、Node.js、Javaのクライアントライブラリが用意されており、それぞれサンプルアプリが用意されています。
こちらに各クライアントの利用方法が記載されています。
また、サンプルも用意されています。
今回は、Pythonでの実装方法を試してみます。
Pythonで利用する場合は、まずPython用の mapepire-python
パッケージが必要になります。
pip install mapepire-python
でインストールできます。
~ # pip install mapepire-python
Collecting mapepire-python
Downloading mapepire_python-0.2.0-py3-none-any.whl.metadata (33 kB)
Collecting dataclasses-json>=0.6.4 (from mapepire-python)
Downloading dataclasses_json-0.6.7-py3-none-any.whl.metadata (25 kB)
Requirement already satisfied: websockets>=14.0 in ./vllm-venv/lib64/python3.12/site-packages (from mapepire-python) (15.0.1)
Collecting pyee (from mapepire-python)
Downloading pyee-13.0.0-py3-none-any.whl.metadata (2.9 kB)
Collecting pep249abc (from mapepire-python)
Downloading pep249abc-0.0.1b3-py3-none-any.whl.metadata (5.5 kB)
Collecting marshmallow<4.0.0,>=3.18.0 (from dataclasses-json>=0.6.4->mapepire-python)
Downloading marshmallow-3.26.1-py3-none-any.whl.metadata (7.3 kB)
Collecting typing-inspect<1,>=0.4.0 (from dataclasses-json>=0.6.4->mapepire-python)
Downloading typing_inspect-0.9.0-py3-none-any.whl.metadata (1.5 kB)
Requirement already satisfied: packaging>=17.0 in ./vllm-venv/lib64/python3.12/site-packages (from marshmallow<4.0.0,>=3.18.0->dataclasses-json>=0.6.4->mapepire-python) (25.0)
Collecting mypy-extensions>=0.3.0 (from typing-inspect<1,>=0.4.0->dataclasses-json>=0.6.4->mapepire-python)
Downloading mypy_extensions-1.1.0-py3-none-any.whl.metadata (1.1 kB)
Requirement already satisfied: typing-extensions>=3.7.4 in ./vllm-venv/lib64/python3.12/site-packages (from typing-inspect<1,>=0.4.0->dataclasses-json>=0.6.4->mapepire-python) (4.12.2)
Downloading mapepire_python-0.2.0-py3-none-any.whl (40 kB)
Downloading dataclasses_json-0.6.7-py3-none-any.whl (28 kB)
Downloading marshmallow-3.26.1-py3-none-any.whl (50 kB)
Downloading typing_inspect-0.9.0-py3-none-any.whl (8.8 kB)
Downloading mypy_extensions-1.1.0-py3-none-any.whl (5.0 kB)
Downloading pep249abc-0.0.1b3-py3-none-any.whl (18 kB)
Downloading pyee-13.0.0-py3-none-any.whl (15 kB)
Installing collected packages: pyee, pep249abc, mypy-extensions, marshmallow, typing-inspect, dataclasses-json, mapepire-python
Successfully installed dataclasses-json-0.6.7 mapepire-python-0.2.0 marshmallow-3.26.1 mypy-extensions-1.1.0 pep249abc-0.0.1b3 pyee-13.0.0 typing-inspect-0.9.0
設定ファイルを用意します。
このファイルには、Db2 for i への接続情報を記述します。
SERVER
, PORT
, USER
, PASSWORD
のところはお使いの環境に合わせて変更してください。
mapepire-server のデフォルトポートが 8076
になっているので、何も変更をしていない場合 8076
を記入してください。
[mapepire]
SERVER="SERVER"
PORT="PORT"
USER="USER"
PASSWORD="PASSWORD"
それでは、スキーマ DEMOLIB
にある テーブル TOKMSP
を2レコード表示する Python のコードを作ります。
TOKMSP
は、下記画像のようなレコードが登録されています。
下記のサンプルを参考にして作成しています。
https://github.com/Mapepire-IBMi/samples/tree/main/python
出力結果が少し見やすいように、JSON形式で出力されるようにしています。
import configparser
from mapepire_python.client.sql_job import SQLJob
from mapepire_python.data_types import DaemonServer
import json
config = configparser.ConfigParser()
config.read('mapepire.ini')
creds = DaemonServer(
host=config['mapepire']['SERVER'],
port=config['mapepire']['PORT'],
user=config['mapepire']['USER'],
password=config['mapepire']['PASSWORD'],
ignoreUnauthorized=True
)
with SQLJob(creds) as sql_job:
with sql_job.query("select * from DEMOLIB.TOKMSP") as query:
result = query.run(rows_to_fetch=2)
[print(json.dumps(s, ensure_ascii=False)) for s in result['data']]
出力結果は、以下のようになります。
日本語も正しく表示されています。
全角スペースなどの処理が必要な場合もありますが、文字列の操作で対応できるはずです。
~ # python get_tokmsp.py | jq .
{
"TKBANG": "01010",
"TKNAKN": "アイ リヨカン",
"TKNAKJ": "阿井旅館 ",
"TKADR1": "東京都渋谷区 ",
"TKADR2": "桜ヶ丘30",
"TKTIKU": "02",
"TKPOST": "151",
"TKTELE": "03-504-9293",
"TKGURI": 698500,
"TKNURI": 4086300,
"TKZURI": 6615600,
"TKUZAN": 1000000,
"TKGEND": 1100000,
"TKNYUK": 880427,
"TKSIME": "2"
}
{
"TKBANG": "01020",
"TKNAKN": "アイ コウギヨウ",
"TKNAKJ": "阿井工業 ",
"TKADR1": "東京都渋谷区 ",
"TKADR2": "渋谷1-3 ",
"TKTIKU": "02",
"TKPOST": "150",
"TKTELE": "03-535-5951",
"TKGURI": 452800,
"TKNURI": 2713600,
"TKZURI": 4483700,
"TKUZAN": 670000,
"TKGEND": 1150000,
"TKNYUK": 880607,
"TKSIME": "2"
}