IBM i RiSING - IBM i 若手技術者コミュニティ 2025
G班 idb-connector 担当 社会人1年目の @ioliol です。
前回の記事「【IBM i × Node.js】idb-connector 前編」では、idb-connector の概要、itoolkit との違い、そしてインストール方法までを紹介しました。
今回は、いよいよ実践編です。
idb-connector の2つの中心的クラスである
- dbconn(データベース接続の管理)
- dbstmt(SQL文の実行)
を使って、実際に Db2 for i データベースを作成・操作していきます。
Db2 for i の準備をしよう
まず簡単なデータベース環境を作成してみましょう。
これらは 5250画面(SQLコマンド行) または ACS の SQL スクリプト実行機能で行えます。
Step.1 SQLを始める
STRSQL
Step.2 ライブラリを作成
IBM i ではライブラリの作成に CRTLIB がありますが、SQL よりスキーマを用いてライブラリの作成を行います。
ふたつの違いとして、CRTLIB は単純な箱(ライブラリ)を作成するのに対して、CREATE SCHEMA はデータベースを作成するにあたって必要なファイルを生成します。
CREATE SCHEMA MYLIB
Step.3 テーブルを作成
次に、ユーザー情報を格納する USERS テーブルを作成します。
今回は、「ユーザーの名前」と「メールアドレス」を追加していきます。
CREATED_AT では、追加した時刻を記録していきます。
CREATE TABLE MYLIB.USERS (
ID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
USERNAME VARCHAR(50),
EMAIL VARCHAR(100),
CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
Step.4 動作確認
作成されたテーブルを確認します。
SELECT * FROM MYLIB.USERS
空の結果が返れば準備完了です。
idb-connector の2つの柱
idb-connector モジュールの役割は主に2つあります。
| クラス | 意味 | 役割 |
|---|---|---|
| {dbconn} | DataBase CONNection | Db2 for i に接続する |
| {dbstmt} | DataBase STateMent | SQLを実行する |
つまりは、「dbconnで接続」して「dbstmtで命令を出す」という2段構成です。
{dbconn} サーバーのデータベースに接続する
前編のおさらいでもありますが、データベースに接続してみましょう。
const {dbconn} = require('idb-connector');
const connection = new dbconn();
connection.conn('*LOCAL');
console.log('接続成功!');
connection.disconn();
connection.close();
インスタンス化
const {dbconn} = require('idb-connector');
const connection = new dbconn();
ここでは、 idb-connector モジュールから dbconn クラスを読み込み、new 演算子でオブジェクトを生成しています。
例えるなら、dbconn が「車の設計図」で、connection が「実際に動く車」です。以降の操作はすべてこの connection を使って行います。
.conn()
データベースに接続します。ご自身の環境合わせて選択してください。
// ローカル Db2 for i に接続
connection.conn('*LOCAL');
// リモートサーバーに接続する場合
connection.conn('database', 'user', 'password');
-
*LOCAL: IBM i サーバー上の Db2 for i に接続 -
'database', 'user', 'password': リモート環境への接続
.disconn() & .close()
connection.disconn();
connection.close();
2段階で切断を行います。
-
.disconn(): Db2 for i との接続を終了 -
.close(): 使用リソースを完全解放
イメージとしては、.disconn() が「アプリ終了」.close() が「PCの電源を切る」みたいな感じです。
{dbstmt} SQLを実行して操作する
いよいよ、接続した Db2 for i に対して実際の SQL を発行していきます。
以下の例では、上記で作成した USERS テーブルにデータを登録します。
const { dbconn, dbstmt } = require('idb-connector');
const connection = new dbconn();
connection.conn('*LOCAL');
const statement = new dbstmt(connection);
statement.prepareSync('INSERT INTO MYLIB.USERS (USERNAME, EMAIL) VALUES (?, ?)');
statement.bindParametersSync(['liolio', 'liolio@example.com']);
statement.executeSync();
console.log('データを登録しました。');
statement.close();
connection.disconn();
connection.close();
処理の流れ
{dbstmt} を使ったデータ操作の流れは、次のようになります。
- dbstmtオブジェクト(
statement)を生成 - SQL文を準備
prepareSync() - プレースホルダーに値をバインド
bindParametersSync() - SQL文を実行
executeSync() - 後処理
close()
ステートメントを作成
const statement = new dbstmt(connection);
ここで、SQLを実行するためのステートメントオブジェクトを作成します。
この statement が1つのSQL実行単位になります。
以降に登場する .prepareSync(), .bindParametersSync(), .executeSync() は、このステートメントオブジェクト内部で完結しており、他のステートメントには干渉しません。
.prepareSync()
statement.prepareSync('INSERT INTO MYLIB.USERS (USERNAME, EMAIL) VALUES (?, ?)');
.prepareSync() は、実行したいSQL文を準備(事前解析)するメソッドです。
なぜ準備をしているのでしょうか。
SQL文を覗いていただくと ? があることが確認できると思います。これは、プレースホルダ(placeholder)と呼ばれ、後で値を埋め込むための「空欄」を示します。
この時点ではプレースホルダには何も入っておらず、「値の入力待ち」の状態になっています。つまり、値を受け取るために事前に準備をしています。
プレースホルダとは?
SQLや多くのプログラミング言語で使われる概念で、実際の値を直接埋め込まずに「後から差し替える仕組み」を指します。これは、セキュリティ(SQLインジェクション対策)や可読性の向上にも役立ちます。
補足
SQL文を分解すると、次のような構造になっています:
INSERT INTO MYLIB.USERS (USERNAME, EMAIL) VALUES (?, ?)
プレースホルダ (?, ?) の値 VALUES を、ライブラリ MYLIB 内のテーブル USERS の中に存在する、ユーザー名とメール (USERNAME, EMAIL) カラムに対して INTO 追加する INSERT。
.bindParametersSync()
statement.bindParametersSync(['liolio', 'liolio@example.com']);
.bindParametersSync() は、.prepareSync() で指定したプレースホルダに実際の値を結びつける(バインドする)処理です。
ここでは固定値 ['liolio', 'liolio@example.com'] を指定していますが、通常はWebフォームなどから入力された値を変数として受け取り、それをここで渡します。
バインドとは?
バインド(bind)とは「結びつける」などを意味します。今回であれば、ステートメント ? の位置に値を結びつけて、SQL文を完成させていきます。
.executeSync()
statement.executeSync();
.executeSync() は、.prepareSync() で準備し、.bindParametersSync() で値をバインドした SQL 文を実際に実行します。
Synchronous(同期的)について
ここまで紹介してきた3つのメソッド .executeSync() .prepareSync() .bindParametersSync() には、共通点として後ろに Sync が付いています。
これは、処理が終わるまで次の処理に移らないことを表しています。
今回は、簡略化を意図して「同期処理」を行っていますが、idb-connector には「非同期処理」メソッドも用意されています。
JavaScript は基本的に、「非同期処理」が得意な言語です。是非とも、この「同期処理」で書かれている上記のソースコードを自由に書き換えて「非同期処理」にしてみてください。
まとめ
お疲れ様でした。
これで idb-connector を用いて Db2 for i への接続と実際にデータを登録することができました。これからの発展として、実際にユーザーがWebサイト上からサインインする仕組み作りにも挑戦してみてください!
idb-connector は、軽量・直感的・高速 という三拍子が揃った非常に強力なツールです。
特に、WebアプリやAPIサーバーの開発において、IBM i の資産をそのまま活かせる点は大きな魅力です。
IBM i の持つ堅実なシステムと拡張性を少しでも感じていただければ幸いです。
参考文献
当記事の著作権はIBMに帰属します。
詳細はこちらを参照ください