Matabase Model/モデル機能使って、毎回のタイムゾーン変更を省略!

に公開

現在、海外向けサービスを開発しているため、DBに保存されている時刻をUTCで保存しています。
そのため、Metabaseを用いてデータを一覧する際に、UTC以外のタイムゾーンで表示したい場合、毎回変換が必要となります。JSTで表示したい場合もPST/PDTで表示したい時も場合もあり、毎回毎回変換するのがとても面倒です。

SELECT 
  timezone('Asia/Tokyo', created_at at time zone 'UTC') as created_at,
  timezone('America/Los_Angeles', created_at at time zone 'UTC') as created_at,
  *
FROM 
  users

このような面倒さをModel機能で解決できました!

Model / モデル機能

自分たちの好きなようにテーブルを再定義できる機能です。
質問または、SQLクエリで定義する事ができます。

今回のように、タイムゾーンを最適化したり、enumで定義している値を変換したり、よく使う値を計算させたり、自分たちの使いやすいようなテーブルを定義することができます。

使い方

モデル定義

サイドバーメニューからモデルの一覧を開き、右上から新規モデルの追加ができます。

作成方法を質問かSQLクエリか選択します。
今回はモデルの定義をSQLクエリで行いました。

クエリの書き方は通常と同じです。自分の表示したい形式にしたデータを定義します。

モデル定義
SELECT 
  -- 日本時間のcreated_atをcreated_at_japanとして再定義
  timezone('Asia/Tokyo', created_at at time zone 'UTC') as created_at_japan, 
  -- アメリカ・ロサンゼルス時間のcreated_atをcreated_at_us_losとして再定義
  timezone('America/Los_Angeles', created_at at time zone 'UTC') as created_at_us_los, 
  *
FROM 
  users

実行し、意図したデータになっているかを確認し、保存するだけです。

モデルを参照する

次に、クエリからモデルを参照してみます。
通常のクエリを書くときに、{{#xxxx}}という形で書くと存在するモデル(もしくは、クエリの結果)を参照することができます。

エディタ内で{{#}}内に文字を入力すると、候補としてモデル、クエリの名前が出てくるので、選択します。

最終的なクエリは以下です。

クエリ
SELECT
  *
FROM
  {{#1012-test-user-model}}

実行すると、先程定義したデータを取得することができます。これで毎回のタイムゾーンの変換の手間から解放されました!

結合などは???

もちろん既存のテーブルと結合して参照することも可能です。基本的には、他のテーブルと同じような扱いができると思います。

例: user_daily_accessテーブルとの結合
SELECT
  *
FROM
  {{#1012-test-user-model}} as users
  left outer join user_daily_accesses on users.id = user_daily_accesses.user_id

使い方案

今回はタイムゾーンの変換を事前にしておくために利用しましたが、以下のようなパターンにも利用できそうです。

  • enumの変換

  • 時間の事前計算(秒->分など)

  • よく結合するテーブルの結合

参照

Discussion