データサイエンス100本ノック環境構築時、テーブル作成がされていないとき

## はじめに
この記事はデータサイエンス100本ノック環境構築時、テーブル作成されない場合の解決策を示すものである。

https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

## 環境
- Windows 10 Home

## 問題
install から
`docker-compose up -d --build`
後、DBにテーブルが作成されていない状態となる。

## 原因

Windowsでgitを利用する場合、改行コードが変更されてしまうため。
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess#install
> ※ Windowsでgitを利用する場合、デフォルト設定でのインストールを行うとスクリプトの改行コードを変えられてしまい、データベースを正しく構築できないことがあります - #1 (comment)
> ※ 改行を変えないよう設定するか、ZIPをダウンロードして利用してください


## 解決策
以下から選択して実行
- ZIPダウンロード
    - すでに`git clone`してしまった場合、1から環境構築し直す手間が発生
- 改行を加えないように変更
    -  https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess/issues/1#issue-640590032
- スクリプトを手動実行
    - テーブル作成諸々のスクリプトが改行コードによって実行されていないだけなので、流しなおせばよい。
    -> 他２つについては解説記事があるので、今回はこちらについて解説

## 実行手順

- スクリプトの配置ディレクトリを把握
    - [docker\db\init](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess/tree/master/docker/db/init)
 
:::note
Tip
[docker-compose.yml](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess/blob/master/docker-compose.yml#L18-L20)に読み込みvolumesが定義されている
`./docker/db/init:/docker-entrypoint-initdb.d`
:::

- dockerを立ち上げた後、適当な場所に`ipynb`を作成
- 下記クエリ実行（create_table, load抜き出し）
    - 一旦これでJupyterNotebookからSQL実行可能となる
```sql
%%sql
/*
* create_table
*/
 -- customer
    drop table if exists customer;
    create table customer(
      customer_id            VARCHAR(14),
      customer_name          VARCHAR(20),
      gender_cd              VARCHAR(1),
      gender                 VARCHAR(2),
      birth_day              DATE,
      age                    INTEGER,
      postal_cd              VARCHAR(8),
      address                VARCHAR(128),
      application_store_cd   VARCHAR(6),
      application_date       VARCHAR(8),
      status_cd			         VARCHAR(12),
      primary key (customer_id)
    );

    -- category
    drop table if exists category;
    create table category(
      category_major_cd     VARCHAR(2),
      category_major_name   VARCHAR(32),
      category_medium_cd    VARCHAR(4),
      category_medium_name	VARCHAR(32),
      category_small_cd	    VARCHAR(6),
      category_small_name	  VARCHAR(32),
      primary key (category_small_cd)
    );


    -- product
    drop table if exists product;
    create table product(
      product_cd            VARCHAR(10),
      category_major_cd     VARCHAR(2),
      category_medium_cd    VARCHAR(4),
      category_small_cd	    VARCHAR(6),
      unit_price            INTEGER,
      unit_cost             INTEGER,
      primary key (product_cd)
    );

    -- store
    drop table if exists store;
    create table store(
      store_cd      VARCHAR(6),
      store_name    VARCHAR(128),
      prefecture_cd VARCHAR(2),
      prefecture    VARCHAR(5),
      address       VARCHAR(128),
      address_kana  VARCHAR(128),
      tel_no        VARCHAR(20),
      longitude     NUMERIC,
      latitude      NUMERIC,
      floor_area    NUMERIC,
      primary key (store_cd)
    );

    -- receipt
    drop table if exists receipt;
    create table receipt(
      sales_ymd       INTEGER,
      sales_epoch     INTEGER,
      store_cd        VARCHAR(6),
      receipt_no      SMALLINT,
      receipt_sub_no  SMALLINT,
      customer_id     VARCHAR(14),
      product_cd      VARCHAR(10),
      quantity        INTEGER,
      amount          INTEGER,
      primary key (sales_ymd, store_cd, receipt_no, receipt_sub_no)
    );

    -- geocode
    drop table if exists geocode;
    create table geocode(
      postal_cd       VARCHAR(8),
      prefecture      VARCHAR(4),
      city            VARCHAR(30),
      town            VARCHAR(30),
      street          VARCHAR(30),
      address         VARCHAR(30),
      full_address    VARCHAR(80),
      longitude       NUMERIC,
      latitude        NUMERIC
    );

/*
* load
*/
-- customer
COPY customer FROM '/tmp/data/customer.csv'
WITH CSV HEADER
;

-- category
COPY category FROM '/tmp/data/category.csv'
WITH CSV HEADER
;

-- product
COPY product FROM '/tmp/data/product.csv'
WITH CSV HEADER
;

-- receipt
COPY receipt FROM '/tmp/data/receipt.csv'
WITH CSV HEADER
;

-- store
COPY store FROM '/tmp/data/store.csv'
WITH CSV HEADER
;

-- geocode
COPY geocode FROM '/tmp/data/geocode.csv'
WITH CSV HEADER
;


```

:::note warn
warning
下記実行後でないとSQLは実行できないため、起動時に実行すること
```py
%load_ext sql
import os

pgconfig = {
    'host': 'db',
    'port': os.environ['PG_PORT'],
    'database': os.environ['PG_DATABASE'],
    'user': os.environ['PG_USER'],
    'password': os.environ['PG_PASSWORD'],
}
dsl = 'postgresql://{user}:{password}@{host}:{port}/{database}'.format(**pgconfig)

# MagicコマンドでSQLを書くための設定
%sql $dsl
```
:::


以上