概要
食品名をキーにしてその食品の栄養価を検索できるようなクラウド・サービスがあれば何かと便利です。この記事では最終的にREST APIで検索できる食品栄養価DBを3分ほどで作成してみます。
利用するサービス
食品栄養価情報を保存するクラウド・データベースとしてOracle Database Cloudを利用します。今回はその中でも無償で利用できるapex.oracle.comを利用することします。apex.oracle.comのアカウントをお持ちでない方はすぐに作成できるので下記を参照いただきながら作成してみてください。
apex.oracle.comで無償の開発用Database Cloud環境を取得する
食品栄養価データのダウンロードとインポート
元データのダウンロード
元となる食品情報は文部科学省が提供している日本食品標準成分表 2015年版(七訂)を利用します。このデータはPDFとExcelファイルとして提供されています。このデータをDatabase Cloudにインポートしてクラウド・サービスとして利用できるようにしようという魂胆です。
オリジナルをダウンロードして見ていただければわかりますが、このデータ、あまり綺麗じゃない(ちゃんと正規化されてない)ので若干修正する必要があります。今回はすでに修正済みの下記のデータをダウンロードして利用します。
Database Cloudへのインポート
データベースは空っぽの状態からはじめます。CSVファイルをインポートすると同時に新しい表を作成し、データをインポートするようにします。
まずapex.oracle.comの自分のワークスペースにログインします。
上部のナビゲーションメニューから、SQLワークショップ > ユーティリティ > データ・ワークショップを選択します。
今回はCSVファイルをインポートしますので、データ・ロードのセクションで、スプレッドシートを選択します。
下記のようにインポート方法を指定して「次へ」ボタンをクリックします。
- ロード先:新しい表
- ロード元:ファイルをアップロード
テキスト・ファイルに先ほどダウンロードしたCSVファイルを指定して「次へ」ボタンをクリックします。
次にテーブルの設定です。まず表名を food とします。CSVファイルから自動的に列名やデータ型が判定されていますが、もし下記の列でvarchar2になっているものがあれば、すべてnumberに変更してください。
- calorie
- water
- protein
- carb
- fat
- fiber
- ash
最後に主キー(プライマリキー)の設定です。今回はfood_idという列が一位な識別子になっているので、これをそのまま主キーとします。下記のように設定して「データロード」ボタンをクリックします。
- 主キーの移入元: 既存の列を使用
- 主キー: FOOD_ID
- 主キー制約名: FOOD_PK
- 主キーの移入: 新しい順序から生成
- 順序: FOOD_SEQ
では新しい表が作成され、データがインポートされているか確認します。
ナビゲーションメニューからSQLワークショップ > オブジェクト・ブラウザを選択します。
左のサイドバーで、新たに作成されているはずのFOODを選択し、さらに「データ」タブを選択してデータが入っていることを確認します。
これでデータはDatabase Cloudにインポートされました。
REST APIの作成
ではAPI経由でデータを検索できるようにREST APIを作成します。
ナビゲーションメニューからSQLワークショップ > RESTfulサービスを選択します。
下記のように設定し「モジュールの作成」ボタンをクリックします。
- 名前: food *このAPIの名前です
- URIテンプレート: food/{food_name} *このAPIにアクセスするためのURIを指定します
- 方法: GET *このAPIにアクセスするときのHTTPメソッドを指定します
- ソース・タイプ: 問い合わせ *このAPIにアクセスしたときの処理タイプを指定します
- 書式: JSON *このAPIのレスポンスフォーマットです
- ソース: *このAPIにアクセスしたときに実行される処理をSQLで記述します(下記参照)
select * from food where food_name like '%' || :food_name || '%'
作成されたらテストしてみます。左サイドバーから「GETを選択してください。
するとブラウザ上で下図のようなJSONデータが表示されるはずです。
ブラウザによってはこの内容が記載されたテキストファイルをダウンロードする挙動になる場合があります。その場合はそのテキストファイルをエディター等で開いて確認してください。
このAPIはURIの末尾に栄養価を取得したい食品名をいれてアクセスしますが、前述のテストボタンをクリックしたそのままだとその末尾が正しくセットされていないので空の配列がレスポンスとして返ってきた状態です。
ということで次は末尾に食品をセットしてみます。例えばハンバーグの栄養価を取得したい場合は下記のようなURIになるでしょう。
https://apex.oracle.com/pls/apex/あなたのワークスペース名/food/ハンバーグ
蛇足ですが、JSONパーサーのようなアドオンをブラウザにインストールしていれば下図のように綺麗に表示できます。
まとめ
こんな感じで、現在PDFやExcelでしか配布されていないデータがあれば、Oracle Database Cloudにインポートし、APIをちょこっと設定すればすぐにクラウドサービスとして各種アプリケーションからアクセスできるようになります。