はじめに
Re:Dashは画面を作りたくないエンジニアにとって、
クエリを組むだけでそれっぽい画面やグラフ化なんかもできてとっても便利。
でもクエリを作るだけじゃなくて、もう少しデータをごにょごにょしたいことありませんか?
もっというと、異なるデータソースのクエリ結果を結合させたいって思う事ありませんか??
Re:Dashには「pythonデータソース」なるものが用意されていて、
ちょっと設定をすればpythonでデータをごにょごにょできるようになっちゃいます。
これがとっても便利だったので、今回は設定の仕方から主要な機能・使い方の紹介をさせて頂きます。
pythonデータソースを使用できるようにする
デフォルトではpythonデータソースは使用できないようになっています。
下記設定を追加すればデータソースからpythonが指定できるようになります。
/opt/redash/.env の修正
export REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.python
設定を反映させる
sudo supervisorctl restart redash_server
新しいデータソースの追加
Data Sources
から + New Data Sources
をクリック。
Type
にPython
が選択できるようになっているので選択し、Name
に適当な名前を入れてsave
すると
クエリ作成時にPythonデータソースが選択できるようになります。
ごにょごにょしたいデータを用意する
予めごにょごにょする前のデータを準備しておきます。
詳しくはこの記事では割愛させて頂きますが、定期実行を設定して必要なデータのみを必要なタイミングで取得・キャッシュさせておきましょう。
今回は「異なるデータソース間の数値を合算させて表示させる」という目的を想定して準備してみます。
簡単なクエリ結果を下記のように2つ用意。
データ①
作成したクエリのクエリIDをメモしておく。今回このクエリは クエリID=76
とする
データ②
作成したクエリのクエリIDをメモしておく。今回このクエリは クエリID=77
とする
データをごにょごにょしてみる
どんな想定かはさておきw
2つの異なるデータソースから取得したクエリ結果から
同じIDのCOUNTを合算させて表示させるようごにょごにょしてみます。
ざっくり書いてみたコード全容
APIを使用してクエリ結果を取得し、pythonで行いたい処理を書いたらAPIで結果をセットしてあげればOK
※APIについては下記参照
※下記は適当なコードですがforやif文など普通に使えるよ!という例で。。
※get_query_resultで取得したクエリ結果は rows['rows'][行数][カラム名]=値
の形で取得されます。
# 指定したクエリIDのクエリ結果を取得する
queryResults1 = get_query_result(76)
queryResults2 = get_query_result(77)
result = {}
for rows1 in queryResults1['rows']:
for rows2 in queryResults2['rows']:
if rows1['id'] == rows2['id']:
# 行データを追加する
add_result_row(result, {
'id' :rows1['id'],
'count' :rows1['count'] + rows2['count']
})
break
# カラム名を指定する
add_result_column(result, 'id', '', 'integer')
add_result_column(result, 'count', '', 'integer')
主要なAPI
API | 内容 | 例 |
---|---|---|
get_query_result(queryId) | 指定したクエリIDのクエリ結果を取得する | get_query_result(1) |
add_result_row(result, values) | 行データを追加する | add_result_row(result, {'id':rows['id'],'count':rows['count']}) |
add_result_column(result, columnName, friendlyName, columnType) | カラム名を指定する | add_result_column(result, 'id', '', 'integer') |
execute_query(dataSourceName, query) | queryをdataSourceName上で実行し結果を取得する | execute_query('testDataSource', 'select * FROM test WHERE id = 1') |
詳しくは実際のRe:dash内部のソースを読んでみてください
モジュールを使いたい場合
Data Sourceのsetting画面からモジュールを追加することで使用できるようになります。
複数追加したい場合はカンマ区切りで追加します。
saveをしたらコード上でimportしてあげるだけで使用できるようになります。
さいごに
普通にpythonでコードが書けてしまうので、少し複雑な処理もさせることができ
利用の幅が広がるのではないかと思います。なにより画面を作らなくていいという時点で素晴らしい。。
是非利用してみてください!