RedashハンズオンでRedashへ入門し、その後、気になっていた機能も試してみた

Redash使いの同僚に「Redashを使えるようになるには」を相談したところ、以下のRedashハンズオンを教わりました。
kakakakakku/redash-hands-on: Redash study materials for beginners 📊

 
ハンズオン資料をさらっと流し見したところ、

と、Redash何も分からない自分が入門するのにはちょうど良さそうでしたので、この週末に入門してみました。

 
ハンズオンでは実際に使いそうな

などを学ぶことができました。

丁寧な資料をつくってくださり、ありがとうございました。

 
ハンズオンが終わった後、ふと

  • SQLiteのデータをRedashで表示する
  • MySQLのデータとSQLiteのデータを結合して表示する

ができないか気になりました。

そこで、追加でためしてみたのでメモを残します。

 
目次

 

環境

 

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のデータを結合して表示する

続いて、今まで作ってきたMySQLSQLiteのデータを結合して表示してみます。

Redashでは、QueryResultsという機能を使えば良さそうでしたので、ためしてみます。

 

Data Sourceに Query Results を追加

Settingsの New Data Source をクリックし、 Query Results を選択します。

Nameは任意の値 (今回は MyQueryResults) を指定します。

 

MySQLSQLiteをData Sourceとするクエリを作成

各Data SourceのクエリIDを確認する

今回、MySQLSQLiteをData Sourceにするため、それぞれのクエリIDを確認します。

クエリIDは、URLの queries の下にある数値なため、今回のクエリIDはそれぞれ

  • MySQL
    • URLは http://localhost/queries/1 より、クエリIDは 1
  • SQLite
    • URLは http://localhost/queries/2 より、クエリIDは 2

とわかりました。

 

2つのData Source の結合クエリを作成する

準備ができたのでクエリを作成します。

左側のペインでは、上記で作成したQuery Resultsである MyQueryResults を指定します。

続いて、MySQLSQLiteをData SourceとしたSQLを作成します。

今回は

  • SQLitecustomer テーブルを主にする
  • SQLitecountry_codeMySQLCustomerCode を結合条件にする
  • 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

 
クエリを実行してみると、MySQLSQLiteのデータを結合した形で表示できました。

 
以上より、気になっていたことはいずれも実現できると分かりました。