LoginSignup
1
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-13

はじめに

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

環境

  • 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から環境構築し直す手間が発生
  • 改行を加えないように変更
  • スクリプトを手動実行
    • テーブル作成諸々のスクリプトが改行コードによって実行されていないだけなので、流しなおせばよい。
      -> 他2つについては解説記事があるので、今回はこちらについて解説

実行手順

Tip
docker-compose.ymlに読み込みvolumesが定義されている
./docker/db/init:/docker-entrypoint-initdb.d

  • dockerを立ち上げた後、適当な場所にipynbを作成
  • 下記クエリ実行(create_table, load抜き出し)
    • 一旦これでJupyterNotebookから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
;


warning
下記実行後でないとSQLは実行できないため、起動時に実行すること

%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

以上

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1