ローカルでSQL Server×Redashの環境を作る

この記事は自分用メモみたいなもの

## 目標

- ローカルでRedashを使えるようにする
- RedashのデータソースにSQL Serverを使う

### 手順

1. 各種コンテナの立ち上げ
1. データベースの作成
1. データの投入
1. Redashの接続

## 構築
### 1. 各種コンテナの立ち上げ

今回はローカルのRedash/SQL Serverともにコンテナを使って立ち上げる
Redashについては[こちらの記事](https://qiita.com/ma91n/items/25432b591494501df95d)にかかれている方法で立ち上げることができるが、SQL Serverを使うためには少し修正が必要になる

#### 1.1 SQL Serverを使えるRedashのDockerイメージ作成

[こちら](https://github.com/getredash/setup)のリポジトリから作られるdocker-compose.ymlをそのまま使うと、Redashコンテナ内の`pymssql`のバージョンの関係でSQL Serverにうまく接続できない
具体的には`redash/redash:8.0.0.b32245`のイメージのみ変更が必要なので、このイメージを元にSQL Serverを使えるイメージを生成する

以下のようなDockerfileを作成する

```dockerfile
FROM redash/redash:8.0.0.b32245
RUN pip install --upgrade "pymssql==2.1.4" --user
```

上記Dockerfileが配置されたディレクトリにて以下コマンドを実行する
今回は`redash-test`というイメージ名で作成する

```bash
docker build -t redash-test:1.0.0 .
```

#### 1.2 Redash/SQL Serverのコンテナ立ち上げ

[こちら](https://github.com/getredash/setup)にて用意されるdocker-compose.ymlを元に以下のようなdocker-compose.ymlファイルを作成

```yml
version: "2"
x-redash-service: &redash-service
  image: redash-test:1.0.0
  depends_on:
    - postgres
    - redis
  env_file: /opt/redash/env
  restart: always
  networks:
    - redash

services:
  server:
    <<: *redash-service
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
  scheduler:
    <<: *redash-service
    command: scheduler
    environment:
      QUEUES: "celery"
      WORKERS_COUNT: 1
  scheduled_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1
  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2

  redis:
    image: redis:5.0-alpine
    restart: always
    networks:
      - redash

  mssql:
    image: mcr.microsoft.com/mssql/server:2017-latest
    ports:
      - 1433:1433
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD={任意のパスワード※}
      - MSSQL_LCID=1041
      - MSSQL_COLLATION=Japanese_CI_AS
    networks:
      - redash

  postgres:
    image: postgres:9.6-alpine
    env_file: /opt/redash/env
    volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
    restart: always
    networks:
      - redash

  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always
    networks:
      - redash

networks:
  redash:
    driver: bridge
```

※mssqlにて設定するパスワード
半角英数字で8文字あればとりあえずよい
ポリシーは[こちら](https://docs.microsoft.com/ja-jp/sql/relational-databases/security/password-policy?view=sql-server-ver15)


このdocker-compose.ymlが配置されたディレクトリにて`docker-compose up -d`を実行
実行後`docker container ls`等で以下のように起動が確認できていればOK

```
$ docker container ls
CONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS          PORTS                                        NAMES
e3bce650d8d6   redash/nginx:latest                          "nginx -g 'daemon of…"   12 seconds ago   Up 9 seconds    0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   data_nginx_1
6e1d13e1b92f   redash-test:1.0.0                            "/app/bin/docker-ent…"   16 seconds ago   Up 12 seconds   5000/tcp                                     data_adhoc_worker_1
b31aeb169b19   redash-test:1.0.0                            "/app/bin/docker-ent…"   16 seconds ago   Up 12 seconds   5000/tcp                                     data_scheduler_1
3d5ebc25e254   redash-test:1.0.0                            "/app/bin/docker-ent…"   16 seconds ago   Up 11 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp    data_server_1
78e2d2a931f5   redash-test:1.0.0                            "/app/bin/docker-ent…"   16 seconds ago   Up 12 seconds   5000/tcp                                     data_scheduled_worker_1
b6c00c560f88   mcr.microsoft.com/mssql/server:2017-latest   "/opt/mssql/bin/nonr…"   18 seconds ago   Up 15 seconds   0.0.0.0:1433->1433/tcp, :::1433->1433/tcp    data_mssql_1
d2d166c58f9e   postgres:9.6-alpine                          "docker-entrypoint.s…"   18 minutes ago   Up 15 seconds   5432/tcp                                     data_postgres_1
0d7286213d72   redis:5.0-alpine                             "docker-entrypoint.s…"   18 minutes ago   Up 15 seconds   6379/tcp                                     data_redis_1
```

起動が確認できた状態で[localhost:5000](localhost:5000)にアクセスするとRedashの起動が確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/3a080fc6-b749-4b49-e444-56df0b58f9f4.png)

### 2. データベースの作成
#### 2.1 SSMSにてDBに接続

今回は[SQL Server Management Studio (SSMS)](https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15)を用いる
アプリケーションを開くと接続情報の入力画面が現れるので、以下の通り入力する
（※パスワードはdocker-compose.ymlにて設定したmssql用のパスワードを入力）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/b37e88e5-b2d0-c329-2a71-289fcd800051.png)

Server nameの部分は`<hostname>,<port>`なので注意

#### 2.2 SSMSからデータベースの作成

この時点ではデフォルトのデータベースしか用意されていない
デフォルト以外のデータベースを使いたい場合はこの時点で作成しておく
※本当はコンテナ立ち上げ時にできるが、一旦は手動作成する

今回は以下の通りTestDbという名前でデータベースを作成した

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/c980ca40-a471-62f7-93ea-3cdc58fcc73d.png)

### 3. データの投入

今回は以下のようなcsvを投入することでDB内にテーブル・データを用意する


```csvs
id, name
1,sample
2,test
3,hoge
```

SSMSにて先程作成したデータベース名を右クリックし、「Tasks > Import Flat File...」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/ad678374-d61d-bf30-ec76-62f30930db4d.png)

するとImportするファイルを選択できるので、先程作成したファイルを選択（今回はtest.csvというファイル名にしている）

またこの時点でテーブル名とスキーマを選択できる
今回は投入するスキーマを`dbo`、テーブル名を`sample_table`としている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/7c6ab270-3f95-af78-d779-466de55ec060.png)

その後は画面の指示に従い操作する

### 4. Redashの接続

再びRedashに戻る
画面右上のボタンから設定画面へ遷移
遷移した画面のうち「Data Sources」タブから「+ New Data Source」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/44f3c5f6-51bf-f945-c144-944529d47e45.png)

ボタンを押下するとData Sourceの選択画面が現れる
選択肢の中から`Microsoft SQL Server`を選択（検索窓にSQL Serverといれるとすぐ見つかる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/92070325-778f-5dff-133c-03550d28db8e.png)

進んだ画面で接続情報をそれぞれ以下の通り入力
TDS Version, Character Set, Portは編集しない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/89c3b68a-eb38-d628-7ac1-78199790b271.png)

接続情報を登録すると以下のような画面に遷移する
中央下の「Test Connection」ボタンを押下し、右下に「Success」という文字が出れば接続できている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/e3356336-29a7-28ee-db25-71f9671645bb.png)

## クエリを実行してみる

以上でローカルのRedash/SQL Serverの環境はできた
先程SQL Serverに投入したデータを確認する

### クエリ作成画面へ遷移する

画面左上の「Create」ボタンを押下、そこで現れた選択肢のうち「Query」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/6c80b8e2-e312-4211-99ef-156a1939cb89.png)

遷移した先がクエリエディタになっているため、先程作成したテーブルをselectする
selectする際スキーマ名`dbo`もつける必要がある点に注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266078/3a336703-da43-9703-9426-7f895d7cb8be.png)



## 参考資料

- [Redashのローカル環境構築手順](https://qiita.com/ma91n/items/25432b591494501df95d)
- [Setup script for Redash with Docker on Ubuntu 18.04. - getredash/setup](https://github.com/getredash/setup)
- [DockerでSQLServerを起動&初期データ登録](https://qiita.com/urushibata/items/2d499e057fe9ed0cde64)
- [Can’t connect to Microsoft SQL Server with tds version 7.4](https://discuss.redash.io/t/cant-connect-to-microsoft-sql-server-with-tds-version-7-4/6337)
- [Using SQL Server Management Studio to remote connect to docker container
](https://stackoverflow.com/questions/47984603/using-sql-server-management-studio-to-remote-connect-to-docker-container)