RedashのQuery Resultsデータソースでクエリパラメータを使用したクエリを使用する
なんとなく動いたので作業メモついでの記事。
やりたかったこと
Redash 3.0.0の大きな変更点の一つであるQuery Resultsデータソースは現時点でクエリパラメータを使用したクエリを実行できない。
しかし、業務で使っているRedashでは、ほとんどのクエリがクエリパラメータを必要とするため、クエリパラメータを指定してQuery Resultsデータソースを使用できるか検証してみたいと思った。
VagrantでRedashを起動
個人的に開発用途ではDockerよりVagrantのほうが何かと楽なので、Vagrantを使用する。
$ 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というクエリランナーを作成した。
かなり雑なコードや、整理したら不要になるコードが含まれているので、気が向いたら書き換えるかもしれない。
これを先の手順で作成した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データソースのソースを読んで知った。
クエリ
検証の準備を省略するため、テーブルを使用せず以下のようなクエリで動作確認する。
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);
query_[クエリID](パラメータ名1=値1,パラメータ名2=値2)
のように、パラメータはカッコ内にカンマ区切りで列挙できる。
値にカンマを含むものが使用できない、文字列をシングルクォーテーションなどでくくって表記できないなどの問題はあるが、検証なのであまり気にしないでおく。
まとめ
クエリパラメータを使用したクエリでもQuery Resultsデータソースで実行できる可能性があることがわかった。
今後のアップグレードで対応されるかもしれないので、4.0.0のリリースを気にしておきたい。