この記事はRedash Advent Calendar 2018 21日目です。
最近送ってみたRedashのPythonデータソース関連のプルリクについて書きます。
Pythonデータソース
SQL1本で表現しづらいときなどにpandasでデータをゴニョゴニョできたりと、とても便利です。
なんでもできすぎてPythonデータソースが仕事をしすぎると保守が難しいクエリが生まれるという難点がありますが、基本的には便利です。
Pythonデータソースで、 登録したクエリの実行結果を取得
Pythonデータソースで使える関数の1つ get_query_result
は指定したクエリのキャッシュをとってきてくれます。
これもとても便利なのですが、Pythonデータソースをヘビーに使っていると定期実行させたいような性質のクエリで、キャッシュではなく最新のデータをとってきてゴニョゴニョしたい場面があります。
そこで、指定したクエリIDのキャッシュではなく、クエリを実行しその結果を返す関数を実装し、PRを送ってみました(#3132)。業務で使っているRedashにはこの機能をマージして実際に使っています。
execute_by_query_id(query_id, params)
query_id: 実行するクエリのID
params: クエリに埋め込んでいるパラメータ
以下のような日付指定で実行するSQLクエリを登録していたとして、
-- クエリID:1
select
sum(revenue)
from
sales
where
date = {{date}} -- 日付をReadashパラメータ機能で指定
Pythonデータソースではこのように実行できます。
# クエリID=1を実行
data = execute_by_query_id(1, {"date": "2018-12-21"})
ユースケース
こんなユースケースを想定しています。
データ取得したいターゲットのIDをspreadsheetを書いてクエリを実行
1. spreadsheetにモニタリングしたい何らかのマスタのidを書いておく
2. execute_query_by_idで1.のid群を取得
3. 2.の結果をexecute_query_idの param
に渡し、指定したマスタのidでレポートデータを集計するクエリを実行
他にも実際の業務で、指定したクエリの実行結果をspreadsheetに転記するPythonクエリを作り、それをまた別のPythonクエリから実行するようなものが使われたりしています。
深みにハマっていきそうな感じがとてもしますが、野良スクリプトがいろんな所に生息するよりはRedash管理下に置かれている方が便利というのもあります。
さらに小ネタ
Pythonデータソースに add_result_column
, add_result_row
という実行結果として表示する列、行を追加する関数がありますが、
変数名 result
に get_query_result
で取得できるものと同じ形式のdictを入れると add_result_column
, add_result_row
を使わずとも実行結果として列、行が表示されます。
まとめ
RedashのPythonデータソースにありそうでなかった指定クエリ実行機能を実装しました。節度を守って使うと便利ではないかなと思います。マージしてもらえたら嬉しいです。
最後に
2018-12-20に開催されたRedash Meetup 4.0.2-devに参加させていただきました。
Redashの開発に関わられている方々から運用する中でのつらみや工夫の話を聞けて、とても勉強になりました!