RedashのQuery Resultsデータソースでクエリパラメータを使用したクエリを使用する

なんとなく動いたので作業メモついでの記事。

やりたかったこと

Redash 3.0.0の大きな変更点の一つであるQuery Resultsデータソースは現時点でクエリパラメータを使用したクエリを実行できない。

ariarijp.hatenablog.com

しかし、業務で使っているRedashでは、ほとんどのクエリがクエリパラメータを必要とするため、クエリパラメータを指定してQuery Resultsデータソースを使用できるか検証してみたいと思った。

VagrantでRedashを起動

個人的に開発用途ではDockerよりVagrantのほうが何かと楽なので、Vagrantを使用する。

github.com

$ mkdir redash
$ cd redash
$ wget https://raw.githubusercontent.com/ariarijp/vagrantfiles/master/redash/Vagrantfile
$ vagrant up

VMが起動したら、 http://localhost:8080 でRedashにアクセスできる。

Query Results Exデータソースを導入

現状のQuery Results データソースはクエリパラメータに対応していないため、Query Resultsをもとにクエリパラメータ対応を入れたQuery Results Exというクエリランナーを作成した。

github.com

かなり雑なコードや、整理したら不要になるコードが含まれているので、気が向いたら書き換えるかもしれない。

これを先の手順で作成したRedash環境に導入する。

$ vagrant ssh
$ # 以下はVM内で実行
$ sudo wget -O /opt/redash/current/redash/query_runner/query_results_ex.py https://raw.githubusercontent.com/ariarijp/redash-query-runners/master/query-results-ex/query_results_ex.py
$ echo 'export REDASH_ADDITIONAL_QUERY_RUNNERS="redash.query_runner.query_results_ex"' | sudo tee -a /opt/redash/.env
$ sudo service supervisor restart

なお、このデータソースはあくまで技術的に可能かどうかの検証で作成したものなので、本番環境では使用しないことを強くおすすめする。

動作確認

adminアカウントの初期設定などは割愛。

テストデータの準備

検証でデータソースとして使用するデータソースとクエリを以下のように作成する。

データソース

パスに :memory: を指定すると、SQLiteをインメモリで実行できる。これはQuery Resultsデータソースのソースを読んで知った。

In-Memory Databases

クエリ

検証の準備を省略するため、テーブルを使用せず以下のようなクエリで動作確認する。

SELECT * FROM (
  SELECT 1 a, 'foo' b, 0.1 c
  UNION SELECT 2 a, 'bar' b, 0.2 c
  UNION SELECT 3 a, 'baz' b, 0.3 c
)
WHERE a = {{a}} AND b LIKE '%{{b}}%';

Query Results Exデータソースでクエリを実行する

データソース

  • Type: Query Results Ex (Unofficial)
  • Name: Query Results Ex

クエリ

テストデータとして作成したクエリのIDが1である場合、以下のようなクエリを実行する

SELECT * FROM query_1(a=2,b=ba);

f:id:ariarijp:20180212171558p:plain

query_[クエリID](パラメータ名1=値1,パラメータ名2=値2) のように、パラメータはカッコ内にカンマ区切りで列挙できる。

値にカンマを含むものが使用できない、文字列をシングルクォーテーションなどでくくって表記できないなどの問題はあるが、検証なのであまり気にしないでおく。

まとめ

クエリパラメータを使用したクエリでもQuery Resultsデータソースで実行できる可能性があることがわかった。

今後のアップグレードで対応されるかもしれないので、4.0.0のリリースを気にしておきたい。