Edited at
DelphiDay 21

FDBatchMove を使って RESTで取得した JSON データをデータベースに書き込む

これは Delphi Advent Calendar 2018 の 21 日目の記事です

REST デバッカを使って REST API から JSON データを取得する記事を以前書きました

この取得した JSON データは、TFDMemTable というインメモリの DataSet に格納されています

既にデータセットの形でデータが存在しているので、このデータを TFDBatchMove

を使って、一気に InterBase のテーブルにデータとして書き込むということを行ってみました


TFDBatchMove って何

通称 BatchMove

異なる種類のデータを移送する仕組みです

移送元、移送先で扱える標準の Reader/Writer として、テキスト・データセット・SQL が用意されています

ざくっとしたイメージは

batchmove.png

な感じです

たとえば


  • 異種データベース間でデータを流す

  • データベース上のデータをテキスト形式に変換

などの用途に使用できる便利な機能です


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つのフィールドに絞ります

手順ですが

1. 設計画面上の FDMemTable をマウスでダブルクリックします

2. フィールドエディタが表示されます

3. フィールドエディタ上で、マウスの右ボタンをクリックします

4. 表示されたポップアップメニューより「すべてのフィールドを追加」を選択しますbatch01.png

5. 不要なフィールドをマウスで選択して Delete キーを押して削除しますbatch02.png

で絞り込みます


データベースにも同じ構造のテーブルを作っておく

TFDMemTable で絞り込んだ各フィールドの情報を見ると、すべて TWideStringField 長さ 255 で定義されています

今回は InterBase 側のテーブルも、同じフィールド名 (id, event_id, start_time, end_time, title, subtitle, content, act) で varchar 255 で定義しちゃいます

テーブル名は、restTable としました


FireDAC を使って InterBase のテーブルを参照する

IDE の右上にあるプロジェクトマネージャのタブをクリックして、データエクスプローラを表示します

データエクスプローラで、流し込む先のデータベースへの接続設定を行い、接続できることを確認します

定義済みのテーブルをデータエクスプローラからドラッグ&ドロップしてフォーム上に FDConnection と FDQuery を配置します

batch03.png

FDQuery の Enable は True にしておき、データベースと接続しておきます


Reader と Writer コンポーネントにデータセットを設定する

ツールパレットから、TFDBatchMove, TFDBatchMoveDataSetReader, TFDBatchMoveDataSetWriter をドラック&ドロップで配置します (名前が長いので、以下 BatchMove, Reader, Writer とします)

オブジェクトインスペクタで FDBatchMoveDataSetReader 側の DataSet プロパティを FDMemTable1 に設定します

batch04.png

オブジェクトインスペクタで FDBatchMoveDataSetWriter 側の DataSet プロパティを RestTableTable(FDQuery) に設定します

batch05.png


BatchMove コンポーネントに Reader と Writer コンポーネントを関連付ける

実は Reader と Writer が1つずつであれば、自動的に設定されます

Reader および Writer が複数ある場合はオブジェクトインスペクタ上で使用する Reader, Writer を設定します

batch06.png

これで設定は終了です


今回の設計画面

このサンプルでは、分かりやすいように TStringGrid と TButton をそれぞれ2つ配置しています

各 StringGrid は FDMemTable および表示用の FDQuery(データエクスプローラから、もうひとつ restTable を置く)と Visual Live Binding を使って関連付けを行っています

batch18.png


データベースへ書き込む

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上に表示されます

batch19.png

batch20.png

batch21.png


InterBase の操作

今回使用した InterBase 側の操作


  • サーバーの起動

  • データベースの作成

  • テーブルの作成

をまとめておきます


InterBase Server の起動

InterBase を使うには、最初に InterBase Server を起動しておく必要があります

Windows のメニューから InterBase Server Manager を起動します

batch01_1.png

"InterBase サーバーの状態"の横に「停止中」と赤文字で表示されている場合は、サーバーが停止していますので [起動] のボタンをクリックしてサーバーを起動します

batch02.png

"InterBase サーバーの状態"の横の文字が、緑色で「動作中」と表示されていれば OK です

batch03.png

もし、エラーが表示されて起動できない場合は、ライセンスの登録状況を確認(大抵が必要なライセンスが無かったり、間違った認証を行ったりしているのが原因)して、それでも分からなければエンバカデロのインストールサポートに問い合わせましょう


データベースの作成

Windows のメニューから IBConsole を起動します

batch01_2.png

メニューの [データベース|データベースの作成] を選択します

batch04.png

ファイル名など必要な情報を設定して [OK] ボタンをクリックするとデータベースファイル(.ib/.gdb)が作成されます

batch05.png


テーブルの作成

IBConsole でデータベースとの接続が確立している状態で、テーブルを作成します

テーブルエディタや、SQL(DDL)文でテーブルを作成できます


テーブルエディタを使って定義する手順


  1. データベースのツリー構造を展開して、テーブルを選択します

  2. 右側の "データベース" タブの画面内で、マウスの右ボタンをクリックします

  3. 表示されたポップアップメニューから「作成」を選択します batch06.png

  4. テーブルエディタが表示されますので、テーブル名を入力します

  5. [フィールドの追加]ボタンをクリックしてフィールドを追加します
    batch09.png


SQL(DDL) を使って定義する手順


  1. メニューより [ツール|対話型SQL]を選択します batch08.png

  2. ISQL(Interactive SQL)が開くので、テーブルを定義する SQL文(DDL)を記述します

  3. 稲妻マークのボタンをクリックすると、記述した SQL文が実行されてテーブルが作成されます
    batch07.png


あとがき

この記事では、「FDBatchMove」で流しこむことをメインとしたかったので、流し込む先の InterBase 側のフィールドをすべて varchar 255 にしています