これは Delphi Advent Calendar 2018 の 21 日目の記事です
REST デバッカを使って REST API から JSON データを取得する記事を以前書きました
この取得した JSON データは、TFDMemTable というインメモリの DataSet に格納されています
既にデータセットの形でデータが存在しているので、このデータを TFDBatchMove
を使って、一気に InterBase のテーブルにデータとして書き込むということを行ってみました
TFDBatchMove って何
通称 BatchMove
異なる種類のデータを移送する仕組みです
移送元、移送先で扱える標準の Reader/Writer として、テキスト・データセット・SQL が用意されています
ざくっとしたイメージは
な感じです
たとえば
- 異種データベース間でデータを流す
- データベース上のデータをテキスト形式に変換
などの用途に使用できる便利な機能です
Delphi で作ってみる
Delphi 10.2.3 Tokyo Community Edition を使用しています (10.3 Rio でも同様に作成できます)
VCL でも FireMonkey でも作れます (この記事では FireMonkey で作りました)
JSON データを読み込むところまでは Delphi Community Edition Meet up ! - REST 編 をご参照ください
TFDMemTable に読み込んだデータセットは必要なフィールドだけに絞ってしまう
全部のフィールドデータは必要ないので、TFDMemTable 上で必要なフィールドだけに絞ってしまいます
今回は
id, event_id, start_time, end_time, title, subtitle, content, act
の8つのフィールドに絞ります
手順ですが
- 設計画面上の FDMemTable をマウスでダブルクリックします
- フィールドエディタが表示されます
- フィールドエディタ上で、マウスの右ボタンをクリックします
- 表示されたポップアップメニューより「すべてのフィールドを追加」を選択します
- 不要なフィールドをマウスで選択して Delete キーを押して削除します
で絞り込みます
データベースにも同じ構造のテーブルを作っておく
TFDMemTable で絞り込んだ各フィールドの情報を見ると、すべて TWideStringField 長さ 255 で定義されています
今回は InterBase 側のテーブルも、同じフィールド名 (id, event_id, start_time, end_time, title, subtitle, content, act) で varchar 255 で定義しちゃいます
テーブル名は、restTable としました
FireDAC を使って InterBase のテーブルを参照する
IDE の右上にあるプロジェクトマネージャのタブをクリックして、データエクスプローラを表示します
データエクスプローラで、流し込む先のデータベースへの接続設定を行い、接続できることを確認します
定義済みのテーブルをデータエクスプローラからドラッグ&ドロップしてフォーム上に FDConnection と FDQuery を配置します
FDQuery の Enable は True にしておき、データベースと接続しておきます
Reader と Writer コンポーネントにデータセットを設定する
ツールパレットから、TFDBatchMove, TFDBatchMoveDataSetReader, TFDBatchMoveDataSetWriter をドラック&ドロップで配置します (名前が長いので、以下 BatchMove, Reader, Writer とします)
オブジェクトインスペクタで FDBatchMoveDataSetReader 側の DataSet プロパティを FDMemTable1 に設定します
オブジェクトインスペクタで FDBatchMoveDataSetWriter 側の DataSet プロパティを RestTableTable(FDQuery) に設定します
BatchMove コンポーネントに Reader と Writer コンポーネントを関連付ける
実は Reader と Writer が1つずつであれば、自動的に設定されます
Reader および Writer が複数ある場合はオブジェクトインスペクタ上で使用する Reader, Writer を設定します
これで設定は終了です
今回の設計画面
このサンプルでは、分かりやすいように TStringGrid と TButton をそれぞれ2つ配置しています
各 StringGrid は FDMemTable および表示用の FDQuery(データエクスプローラから、もうひとつ restTable を置く)と Visual Live Binding を使って関連付けを行っています
データベースへ書き込む
REST API から読み込んだデータをそのまま BatchMove で InterBase のテーブルに流し込みます
REST API から JSON データを読み込む側は、Button の OnClick イベントに次のコードを記載します
RESTRequest1.Execute; // REST API 経由でデータを読み込む
読み込んだ JSON データを InterBase に流し込む側は、Button の OnClick に次のコードを記載します
FDBatchMove1.Execute; // Reader -> BatchMove -> Writer にデータを流し込みます
FDQuery1.Open; // 流し込んだデータを下の StringGridに表示する
注意: エラー処理は行なっていません
実行してみる
Get ボタンを押すと、REST API で JSON データが読み込まれ、BatchMove ボタンを押すと、そのデータが InterBase 側に流し込まれて、StringGrid上に表示されます
InterBase の操作
今回使用した InterBase 側の操作
- サーバーの起動
- データベースの作成
- テーブルの作成
をまとめておきます
InterBase Server の起動
InterBase を使うには、最初に InterBase Server を起動しておく必要があります
Windows のメニューから InterBase Server Manager を起動します
"InterBase サーバーの状態"の横に「停止中」と赤文字で表示されている場合は、サーバーが停止していますので [起動] のボタンをクリックしてサーバーを起動します
"InterBase サーバーの状態"の横の文字が、緑色で「動作中」と表示されていれば OK です
もし、エラーが表示されて起動できない場合は、ライセンスの登録状況を確認(大抵が必要なライセンスが無かったり、間違った認証を行ったりしているのが原因)して、それでも分からなければエンバカデロのインストールサポートに問い合わせましょう
データベースの作成
Windows のメニューから IBConsole を起動します
メニューの [データベース|データベースの作成] を選択します
ファイル名など必要な情報を設定して [OK] ボタンをクリックするとデータベースファイル(.ib/.gdb)が作成されます
テーブルの作成
IBConsole でデータベースとの接続が確立している状態で、テーブルを作成します
テーブルエディタや、SQL(DDL)文でテーブルを作成できます
テーブルエディタを使って定義する手順
- データベースのツリー構造を展開して、テーブルを選択します
- 右側の "データベース" タブの画面内で、マウスの右ボタンをクリックします
- 表示されたポップアップメニューから「作成」を選択します
- テーブルエディタが表示されますので、テーブル名を入力します
- [フィールドの追加]ボタンをクリックしてフィールドを追加します
SQL(DDL) を使って定義する手順
- メニューより [ツール|対話型SQL]を選択します
- ISQL(Interactive SQL)が開くので、テーブルを定義する SQL文(DDL)を記述します
- 稲妻マークのボタンをクリックすると、記述した SQL文が実行されてテーブルが作成されます
あとがき
この記事では、「FDBatchMove」で流しこむことをメインとしたかったので、流し込む先の InterBase 側のフィールドをすべて varchar 255 にしています