誰得かもしれませんが、ebeanでshow tablesのSQLコマンドを叩き、テーブル名をJSONで取得するやり方をご紹介します。
開発環境
Java8
Play Framework 2.5.1(Java)
sbt 0.13.11
DB構成
DB名: sample_db
テーブル名:
・tweet
・user
モデルの操作は、Playに同梱されているEbeanと呼ばれるORMを利用します
Controller
ここではSampleControllerというコントローラー内のgetTables関数に処理を記述しておきます。
//app/controllers/SampleController.java
public Result getTables() {
String sql = "show tables;";
List<SqlRow> sqlRows = Ebean.createSqlQuery(sql).findList();
List<String> tables = new ArrayList<String>();
sqlRows.forEach((row) -> {
tables.add(row.getString("tables_in_sample_db").toString());
});
JsonNode json = Json.toJson(tables);
return ok(json);
}
ルーティング
GET /tables controllers.SampleController.getTables
これだけでOKです
見てみよう
あとはcurlでAPIを叩いて確認しましょう。
curl "localhost:9000/tables"
value部にちゃんとテーブル名が取得出来ているのが確認出来ました。
["tweet","user"]
ポイント
実装を見てお気づきかもしれませんが、今回の実装では、findListメソッドで取得したSqlRow型Listの結果をそのまま返さず、forEachで新たに作成したString型のListをJSONで返却しました。
これはSqlRowをそのまま返却すると以下のように、カラム名=valueのようなフォーマットで返されてしまうからです。
[{"tables_in_sample_db":"tweet"},{"tables_in_sample_db":"user"}]
tables_in_hogehoge
が必要な場面があるのかはその業務によりけりですが、単純にDBからテーブル名だけを取得したい場合は、新たにListを作ってgetStringメソッドでString化したValueを格納する作業が必要です。