Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

RedashのPythonデータソースで指定したクエリを実行する機能を実装してみた

More than 1 year has passed since last update.

この記事は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の開発に関わられている方々から運用する中でのつらみや工夫の話を聞けて、とても勉強になりました!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away