LoginSignup
3
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-20

これは 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 にしています

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1