db2 on Rails
DB2でさくさく実現するRESTfulなDBアプリ(2)

Railsでレガシーデータを蘇えらせるテクニック

日本アイ・ビー・エム株式会社
Team Ruby
山根 英彦
2008/10/30

ケース2:レガシー表に主キー列に相当する列が存在するが、SMALLINT型の場合

 ibm_dbドライバでは、SMALLINT型の列はboolean型にマッピングされています。そのため、そのまま表示すると「true」や「false」のように表示されてしまいます。

 この場合、ビュー作成時にINTEGER型にキャストします。ID生成列の定義については、SMALLINT型に対しても追加できます。サンプルデータベースのact表を例に説明します。act表は、リスト6のような定義の表です。

●リスト6 act表のサンプル(describe tableの出力より)
C:\Program Files\IBM\SQLLIB\BIN>db2 describe table act

Data type Column Column name schema Data type name Length Scale Nulls --------------------- --------- ------------------- ---------- ----- ------ ACTNO SYSIBM SMALLINT 2 0 いいえ ACTKWD SYSIBM CHARACTER 6 0 いいえ ACTDESC SYSIBM VARCHAR 20 0 いいえ
3 レコードが選択されました。

 「ACTNO」という名前のSMALLINT型の列が使用されています。act表に対しては、サンプル8のようにINTEGER型にキャストしてビューを作成します。

●サンプル8 INTEGER型にキャストしてビューを作成する
CREATE VIEW ACTS AS SELECT CAST(ACTNO AS INTEGER) AS ID,
ACTKWD,ACTDESC FROM ACT

 この例の場合、ビューの元表がSMALLINT型であるため、ID列にSMALLINT型の制限値である32768より大きな値が生成された際にエラーとなるため、注意が必要です。

ケース3:レガシー表に主キー列に相当する列が存在しない、もしくは存在してもCHAR型やVARCHAR型の場合

 主キーとなる列に文字やハイフン(-)などが含まれる場合、CHAR型やVARCHAR型にマッピングされているケースも多く見られます。このような場合、ID生成列を付与した新しい表を作成し、データを移動(ロード)することで対応します。

 サンプルのdepartment表を例に説明します。department表はリスト7のような定義の表です。

●リスト7 department表の内容(describe tableの出力より)
C:\Program Files\IBM\SQLLIB\BIN>db2 describe table department

Data type Column Column name schema Data type name Length Scale Nulls --------------------- --------- ------------------- ---------- ----- ------ DEPTNO SYSIBM CHARACTER 3 0 いいえ DEPTNAME SYSIBM VARCHAR 36 0 いいえ MGRNO SYSIBM CHARACTER 6 0 はい ADMRDEPT SYSIBM CHARACTER 3 0 いいえ LOCATION SYSIBM CHARACTER 16 0 はい
5 レコードが選択されました。

 deptno列はCHARACTER型の列のため、ID生成列とすることができません。そこで、次のようにして、表の作成、データのロードを行います。表の作成後は、「id」という名前の主キー列のある表としてActiveRecordでアクセスできます。

●リスト8 deptno列用に表を作成してロードする
C:\Program Files\IBM\SQLLIB\BIN>db2 CREATE TABLE DEPARTMENTS (ID INTEGER NOT NULL GENERATED AS IDENTITY(START WITH 100),DEPTNO CHAR(3), DEPTNAME VARCHAR(36),MGRNO CHAR(6),ADMRDEPT CHAR(3),LOCATION CHAR(16))  
DB20000I SQL コマンドが正常に完了しました。

C:\Program Files\IBM\SQLLIB\BIN>db2 DECLARE MYCURSOR CURSOR FOR SELECT * FROM DEPARTMENT
DB20000I SQL コマンドが正常に完了しました。

C:\Program Files\IBM\SQLLIB\BIN>db2 LOAD FROM MYCURSOR OF CURSOR INSERT INTO DEPARTMENTS (DEPTNO,DEPTNAME,MGRNO,ADMRDEPT,LOCATION)
NONRECOVERABLE
SQL3501W 順方向リカバリーがデータベースに対して使用できないため、表が存在する表
スペースが、バックアップ・ペンディング状態に置かれません。

SQL1193I ユーティリティーは、SQL ステートメント " SELECT * FROM DEPARTMENT"
からのデータのロードを開始しています。

SQL3500W ユーティリティーが "2008-10-12 19:34:43.696352" に "LOAD"
フェーズを開始しています。

SQL3519W ロード整合点が開始されました。 入力レコード・カウント = "0"

SQL3520W ロード整合点が成功しました。

SQL3110N ユーティリティーが処理を完了しました。 "14"
行が、入力ファイルから読み取られました。

SQL3519W ロード整合点が開始されました。 入力レコード・カウント = "14"

SQL3520W ロード整合点が成功しました。

SQL3515W ユーティリティーは、"2008-10-12 19:34:43.813105" に "LOAD"
フェーズを完了しました。


読み込まれた行数 = 14
スキップされた行数 = 0
ロードされた行数 = 14
拒否された行数 = 0
削除された行数 = 0
コミットされた行数 = 14


C:\Program Files\IBM\SQLLIB\BIN>

読み込み専用の表としてアクセスさせたい場合

 ActiveScaffoldのカスタマイズにより、「Show」以外のメニューを非表示にすることができます。こうすることで、レガシー表を全く変更できない(してはいけない)場合など、前述の方法のようにID列の定義を追加せずに、Create、Update、Deleteを制限することで読み込み専用の表示とすることも可能です。

 app\controllersの下にあるdepartments_controller.rbをサンプル9のように編集します。

●サンプル9 app\controllers\departments_controller.rb
class DepartmentsController < ApplicationController
  active_scaffold :department do |conf|
    conf.actions.exclude :update, :delete, :create
  end
  layout "activescaffold"
end

 サーバを再起動後、Webブラウザで確認します(図3)。

●図3 「Show」以外のメニューが表示されない
fig3

前のページへ 3/4 次のページへ

Index
DB2でさくさく実現するRESTfulなDBアプリ(2)
Railsでレガシーデータを蘇えらせるテクニック
・既存の表にActiveRecordを使うには?
・ActiveRecordを使ったマッピング
ActiveRecordが備える機能|ActiveRecordで表を作成する|DB2での主キーの扱い
ケース1:
レガシー表に主キー列に相当するINTEGER型やBIGINT型の列が存在する場合
レガシー表の内容を確認|主キー列をID生成列に変更する|主キー列と表の名前をRails規約に一致させる2つの方法
→ Page 3
ケース2:
レガシー表に主キー列に相当する列が存在するがMALLINT型の場合
ケース3:
レガシー表に主キー列に相当する列が存在しない、もしくは存在してもCHAR型やVARCHAR型の場合
コラム:読み込み専用の表としてアクセスさせたい場合
・レガシー表へのRESTfulなアクセス
・まとめ

DB2でさくさく実現するRESTfulなDBアプリ



Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間