Redash使いの同僚に「Redashを使えるようになるには」を相談したところ、以下のRedashハンズオンを教わりました。
kakakakakku/redash-hands-on: Redash study materials for beginners 📊
ハンズオン資料をさらっと流し見したところ、
- スクリーンショット付きで丁寧に解説されていたこと
- 継続的にバージョンアップされていること
と、Redash何も分からない自分が入門するのにはちょうど良さそうでしたので、この週末に入門してみました。
ハンズオンでは実際に使いそうな
- グラフを作ってみよう
- 円グラフと棒グラフを作ってみよう
- ダッシュボードを作ってみよう
- パラメータ付きクエリを作ってみよう
- パラメータ付きクエリ(複数値)を作ってみよう
- フィルタ機能を使ってみよう
- クエリスニペットを活用しよう
- クエリ結果に色を付けよう
- リンク集を作ろう
- アラートを設定しよう
などを学ぶことができました。
丁寧な資料をつくってくださり、ありがとうございました。
ハンズオンが終わった後、ふと
ができないか気になりました。
そこで、追加でためしてみたのでメモを残します。
目次
環境
- Windows11のWSL2
- Redash環境はチュートリアルのものをそのまま使用
SQLiteのデータをRedashで表示する
チュートリアルではData SourceとしてMySQLを使っていました。
開発用途ではSQLiteも使うことがあるため、次はSQLiteをRedashで表示してみることにしました。
RedashのSQLite Data Source を追加しようとしたところ、 Database Path
の設定が必要そうでした。
Docker環境で Database Path
には何を指定すればよいか調べたところ、GithubのDiscussionsに情報がありました。
How to properly setup an SQLite Data Source? · getredash/redash · Discussion #6139
これによると、Docker composeのYAMLファイルの中で volumes
を使うことで、Dockerの中にSQLiteファイルを渡せることから、Docker内のパスを指定すれば良さそうでした。
既存のDockerを落とす
まず、SQLiteファイルをDockerに渡すよう設定を変更するため、いったん既存のDockerを落としておきます。
なお、自分の環境では docker-compose
コマンドを実行するとエラーになったので、 -
なしのコマンドを実行しました。
$ docker compose down
SQLiteファイルを作成する
続いて、Dockerの中に渡すSQLiteファイルを作成します。
今回は sqlite3
コマンドで、コマンドラインからファイルを作成します。
Command Line Shell For SQLite
最初に、WSL2側で sqlite3
コマンドを実行したところ、以下のエラーになりました。
$ sqlite3 コマンド 'sqlite3' が見つかりません。次の方法でインストールできます: sudo apt install sqlite3
画面表示に従い、WSL2で sqlite3
コマンドを使えるようインストールします。
$ sudo apt install sqlite3
これでコマンドが使えるようになりました。
続いて、必要なデータを投入します。
今回はローカルに sqlite
ディレクトリを作成し、そのディレクトリの中にSQLiteファイルを作成します。
# ディレクトリを作成 $ mkdir sqlite $ cd sqlite # データを投入 $ sqlite3 mydata.db SQLite version 3.37.2 2022-01-06 13:25:41 Enter ".help" for usage hints. sqlite> create table customer(id integer primary key autoincrement, name text, country_code text); sqlite> insert into customer(name, country_code) values('foo', 'JPN'); sqlite> insert into customer(name, country_code) values('bar', 'JPN'); sqlite> insert into customer(name, country_code) values('baz', 'USA'); # データの確認 sqlite> select * from customer; 1|foo|JPN 2|bar|JPN 3|baz|USA # SQLiteの終了 sqlite> .exit
docker-compose.ymlに volumes を追加
上記で作成したSQLiteファイルをDockerに渡せるよう、 docker-compose.yml
を修正します。
$ vi docker-compose.yml
Githubに従い、以下を追加します。
x-redash-service: &redash-service # ... # x-redash-serviceの末尾に追加 volumes: - ./sqlite:/app/sqlite
あとは docker compose up -d
でDockerを起動します。
起動後、Dockerの中に入り、SQLiteファイルが存在することを確認します
# Dockerの中に入る $ docker compose exec -it server bash # ファイルの存在を確認する redash@2399e07a1360:/app$ ls -al sqlite/ total 24 drwxr-xr-x 2 redash redash 4096 Oct 1 00:27 . drwxr-xr-x 1 redash root 4096 Oct 1 00:29 .. -rw-r--r-- 1 redash redash 12288 Oct 1 00:27 mydata.db
SQLiteのデータをRedashで確認
準備ができたので、あとはRedashで確認してみます。
Settingsから New Data Source
をクリックし、Type Selectionから SQLite
を選択します。
Configurationには以下を設定します。
項目 | 値 |
---|---|
Name | (任意の名前:今回は MyData にした) |
Database Path | /app/sqlite/mydata.db (Docker内のファイルパス) |
これでData Sourceができたので、 New Query
から新しいクエリを作ります。
左側のペインのData Sourceには、先ほど作成したSQLite用の MyData
を指定します。
あとはSQLを記載します。今回は、データを全件取得するSQLを記載します。
SELECT * FROM customer;
準備ができたので Execute
ボタンをクリックすると、下部のtableにSQLiteの中身が表示されました。
MySQLのデータとSQLiteのデータを結合して表示する
続いて、今まで作ってきたMySQLとSQLiteのデータを結合して表示してみます。
Redashでは、QueryResultsという機能を使えば良さそうでしたので、ためしてみます。
Data Sourceに Query Results を追加
Settingsの New Data Source
をクリックし、 Query Results
を選択します。
Nameは任意の値 (今回は MyQueryResults
) を指定します。
MySQLとSQLiteをData Sourceとするクエリを作成
各Data SourceのクエリIDを確認する
今回、MySQLとSQLiteをData Sourceにするため、それぞれのクエリIDを確認します。
クエリIDは、URLの queries
の下にある数値なため、今回のクエリIDはそれぞれ
- MySQL
- URLは
http://localhost/queries/1
より、クエリIDは1
- URLは
- SQLite
- URLは
http://localhost/queries/2
より、クエリIDは2
- URLは
とわかりました。
2つのData Source の結合クエリを作成する
準備ができたのでクエリを作成します。
左側のペインでは、上記で作成したQuery Resultsである MyQueryResults
を指定します。
続いて、MySQLとSQLiteをData SourceとしたSQLを作成します。
今回は
- SQLiteの
customer
テーブルを主にする - SQLiteの
country_code
とMySQLのCustomerCode
を結合条件にする - MySQLでは
CustomerCode
が複数あることから、任意の1つをJOINする- foo, bar, baz の各1レコードずつにする
という形でデータを取得するようなSQLにします。
SELECT * FROM query_2 AS customer INNER JOIN query_1 AS city ON customer.country_code = city.CountryCode GROUP BY customer.name, customer.country_code
クエリを実行してみると、MySQLとSQLiteのデータを結合した形で表示できました。
以上より、気になっていたことはいずれも実現できると分かりました。