Windows10 + heroku + github + Ruby on Rails 事始め③ DB編（2020/02版）

# 概要

 - RoRでDBを扱う
 - ローカル開発環境のDBを参照する
 - github にあげる
 - heroku にデプロイする
 - heroku環境のDBを参照する
    - Webから確認する
    - CLIから確認する（未作成）

# モデル（テーブル）の作成

rails は、以下の形式で、DBのテーブルとカラムの定義ができます。

```bash
rails generate model モデル名 カラム名:データ型 カラム名:データ型 ...
```

以下のような形で、ユーザー情報を保持するテーブルを作ってみましょう。

 - ユーザー情報
    - 名前: string型
    - 性別: integer型
    - 誕生日: date型

```bash
<ワークディレクトリ>/ror-sample (work-create-page)
$ rails generate model user name:string sex:integer birthday:date
      invoke  active_record
      create    db/migrate/20200203060442_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
```

DBディレクトリ以下に、ユーザーテーブル作成用コードが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/0f6195c9-de61-a497-24d2-d830212ea39d.png)

## 初期データ投入

### 定義

初期データは、`<ワークディレクトリ>/db/seeds.rb` で定義できます。
日本語を扱う場合、rbファイルに `# coding: utf-8` を先頭に記載しておいて下さい。

```ruby

# coding: utf-8

user.create(:name => "山田　太郎", :sex => 1, :birthday => "2011-11-14")
user.create(:name => "佐藤　花子", :sex => 2, :birthday => "2012-02-08")
user.create(:name => "田中　葵", :sex => 3, :birthday => "2013-10-25")
```

### 投入

DB定義を変更したので、まず作成し直します。

```bash
$ rails db:migrate
== 20200203060442 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0412s
== 20200203060442 CreateUsers: migrated (0.0413s) =============================
```

DB初期データを投入します。

```bash
$ rake db:seed
```

### 確認

`rails dbconsole` でDBの中身が確認できます。
＃何故かprefixが出てこなくて、動いてないのかとしばし右往左往しました…なんでだろ

```sql
$ rails dbconsole
.table
ar_internal_metadata  schema_migrations
blogs                 users
```

スキーマの確認

```sql
.schema users
CREATE TABLE IF NOT EXISTS "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "sex" integer, "birthday" date, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
```

データ確認

```sql
select * from users;
1|山田　太郎|1|2011-11-14|2020-02-03 06:25:06.659376|2020-02-03 06:25:06.659376
2|佐藤　花子|2|2012-02-08|2020-02-03 06:25:06.827852|2020-02-03 06:25:06.827852
3|田中　葵|3|2013-10-25|2020-02-03 06:25:06.969406|2020-02-03 06:25:06.969406
```

dbconsoleを抜けるときは、 Ctrl + C を押した後、`exit` + Enter で終われます。

# 画面表示

データが投入できたので、これを画面に表示します。

## 画面作成

②の時と同様に、コマンドで画面を作成します。

```bash
<ワークディレクトリ> (work-create-page)
$ rails generate controller user list
      create  app/controllers/user_controller.rb
       route  get 'user/list'
      invoke  erb
      create    app/views/user
      create    app/views/user/list.html.erb
      invoke  test_unit
      create    test/controllers/user_controller_test.rb
      invoke  helper
      create    app/helpers/user_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/user.coffee
      invoke    scss
      create      app/assets/stylesheets/user.scss
```

## controller

controllerで、ユーザー情報をすべて取得する処理を記入します。

`app\controllers\user_controller.rb`

```ruby
class UserController < ApplicationController
  def list
    @users = User.all
  end
end
```

## view

view で、取得したユーザー情報をループで回して表示します。

```ruby
<h1>ユーザー一覧</h1>

<% @users.each do |user| %>
<dl>
    <dt><%= user.name %></dt>
    <dd>
        <ul>
            <li>性別: <%= user.sex %></li>
            <li>誕生日: <%= user.birthday %></li>
        </ul>
    </dd>
</dl>
<% end %>
```

## サーバー起動

```bash
<ワークディレクトリ>\ror-sample>rails server
=> Booting Puma
=> Rails 5.2.4.1 application starting in development
=> Run `rails server -h` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 3.12.2 (ruby 2.6.5-p114), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

無事一覧が表示されました。

`http://localhost:3000/user/list`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/06214fca-9cc1-0bfa-01d6-83bb42d479dc.png)

# github にあげる

```bash
$ git add -A
$ git commit -m "ユーザー一覧画面追加"
$ git push origin work-create-page
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/326973d0-1d23-8309-92ec-ee71c68a8fa5.png)

登録されました。

# heroku にあげる

## github → heroku のデプロイ

```
$ git push heroku work-create-page:master
Counting objects: 30, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (27/27), done.
Writing objects: 100% (30/30), 3.20 KiB | 272.00 KiB/s, done.
Total 30 (delta 14), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
```

## DB作成

```bash
$ heroku run rails db:migrate
Running rails db:migrate on miu200521358-ror-sample... starting, run.1980 (Free)
Running rails db:migrate on miu200521358-ror-sample... connecting, run.1980 (Free)
Running rails db:migrate on miu200521358-ror-sample... up, run.1980 (Free)
D, [2020-02-03T08:15:34.856172 #4] DEBUG -- :    (0.8ms)  SELECT pg_try_advisory_lock(217714722442632450)
D, [2020-02-03T08:15:34.870266 #4] DEBUG -- :    (1.2ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
I, [2020-02-03T08:15:34.871436 #4]  INFO -- : Migrating to CreateBlogs (20200201042410)
D, [2020-02-03T08:15:34.874291 #4] DEBUG -- :    (0.8ms)  BEGIN
== 20200201042410 CreateBlogs: migrating ======================================
-- create_table(:blogs)
D, [2020-02-03T08:15:35.517859 #4] DEBUG -- :    (642.9ms)  CREATE TABLE "blogs" ("id" bigserial primary key, "title" character varying, "body" text, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)
   -> 0.6435s
== 20200201042410 CreateBlogs: migrated (0.6436s) =============================

D, [2020-02-03T08:15:35.523361 #4] DEBUG -- :   ActiveRecord::SchemaMigration Create (1.3ms)  INSERT INTO "schema_migrations" ("version") VALUES ($1) RETURNING "version"  [["version", "20200201042410"]]
D, [2020-02-03T08:15:35.525795 #4] DEBUG -- :    (2.1ms)  COMMIT
I, [2020-02-03T08:15:35.525891 #4]  INFO -- : Migrating to CreateUsers (20200203060442)
D, [2020-02-03T08:15:35.527539 #4] DEBUG -- :    (1.0ms)  BEGIN
== 20200203060442 CreateUsers: migrating ======================================
-- create_table(:users)
D, [2020-02-03T08:15:35.596087 #4] DEBUG -- :    (68.0ms)  CREATE TABLE "users" ("id" bigserial primary key, "name" character varying, "sex" integer, "birthday" date, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)
   -> 0.0685s
== 20200203060442 CreateUsers: migrated (0.0686s) =============================

D, [2020-02-03T08:15:35.597767 #4] DEBUG -- :   ActiveRecord::SchemaMigration Create (0.9ms)  INSERT INTO "schema_migrations" ("version") VALUES ($1) RETURNING "version"  [["version", "20200203060442"]]
D, [2020-02-03T08:15:35.600562 #4] DEBUG -- :    (2.5ms)  COMMIT
D, [2020-02-03T08:15:35.607717 #4] DEBUG -- :   ActiveRecord::InternalMetadata Load (0.9ms)  SELECT  "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2  [["key", "environment"], ["LIMIT", 1]]
D, [2020-02-03T08:15:35.614861 #4] DEBUG -- :    (0.8ms)  BEGIN
D, [2020-02-03T08:15:35.616197 #4] DEBUG -- :    (0.7ms)  COMMIT
D, [2020-02-03T08:15:35.617257 #4] DEBUG -- :    (0.9ms)  SELECT pg_advisory_unlock(217714722442632450)

```

## 初期データ投入

```bash
$ heroku run rake db:seed
Running rake db:seed on miu200521358-ror-sample... starting, run.5401 (Free)
Running rake db:seed on miu200521358-ror-sample... connecting, run.5401 (Free)
Running rake db:seed on miu200521358-ror-sample... up, run.5401 (Free)
D, [2020-02-03T08:17:29.326773 #4] DEBUG -- :    (8.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
D, [2020-02-03T08:17:29.365212 #4] DEBUG -- :    (0.9ms)  BEGIN
D, [2020-02-03T08:17:29.369784 #4] DEBUG -- :   User Create (3.2ms)  INSERT INTO "users" ("name", "sex", "birthday", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "山田　太郎"], ["sex", 1], ["birthday", "2011-11-14"], ["created_at", "2020-02-03 08:17:29.365530"], ["updated_at", "2020-02-03 08:17:29.365530"]]
D, [2020-02-03T08:17:29.371916 #4] DEBUG -- :    (1.7ms)  COMMIT
D, [2020-02-03T08:17:29.373040 #4] DEBUG -- :    (0.8ms)  BEGIN
D, [2020-02-03T08:17:29.376065 #4] DEBUG -- :   User Create (0.9ms)  INSERT INTO "users" ("name", "sex", "birthday", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "佐藤　花子"], ["sex", 2], ["birthday", "2012-02-08"], ["created_at", "2020-02-03 08:17:29.373184"], ["updated_at", "2020-02-03 08:17:29.373184"]]
D, [2020-02-03T08:17:29.377907 #4] DEBUG -- :    (1.5ms)  COMMIT
D, [2020-02-03T08:17:29.378943 #4] DEBUG -- :    (0.7ms)  BEGIN
D, [2020-02-03T08:17:29.381431 #4] DEBUG -- :   User Create (1.7ms)  INSERT INTO "users" ("name", "sex", "birthday", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "田中　葵"], ["sex", 3], ["birthday", "2013-10-25"], ["created_at", "2020-02-03 08:17:29.379172"], ["updated_at", "2020-02-03 08:17:29.379172"]]
D, [2020-02-03T08:17:29.384513 #4] DEBUG -- :    (2.8ms)  COMMIT

```

## 確認

heroku上のDBに初期データが入って、画面が表示できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/2d5a2d4c-7f7d-5f63-5167-f44c74f5f4d8.png)

# heroku上のDBの中身を確認する

## DB情報

```bash
$ heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           1/20
PG Version:            11.6
Created:               2020-02-01 04:06 UTC
Data Size:             8.0 MB
Tables:                4
Rows:                  6/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-flat-20934
```

## Webから確認する

Webの右上にあるメニューから「Data」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/4b705dd3-c453-66fd-b8b0-f91e358b8594.png)

アカウント内のデータストア一覧が表示されます。
どのアプリケーションでどのDBを使用しているかは、上記の `Add-on: postgresql-flat-20934` で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/337a43c5-70d2-5c58-b906-5d025bb6c1d4.png)

DBの詳細が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/ef5fc5e0-88f7-e4f0-26ad-f2f7c900ee00.png)

実際に入っているデータを確認したい場合、「Dataclips」を選びます。
最初は有効になっていないので、「create」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/f200732f-e515-710f-3102-83f251903dde.png)

以下を入力すると、「Save&Run」のボタンが有効化されます。
 - クリップ名
 - 公開範囲
 - クエリ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/cb4a962f-c20b-4ad0-c5ec-33fe369a7222.png)

「Save&Run」のボタンをクリックすると、検索結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/1c6c9f94-3ef0-c85e-f771-11dade8e2577.png)


## CLIから確認する

### PostgreSQLのインストール

CLI で SQL系のコマンドを動かすため、PostgreSQLを導入します。

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads#windows

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/8213f53a-723a-b1d9-c655-71eb31df1b5b.png)

上記の `PG Version: 11.6` を確認し、それと同じバージョンをDLします。

（以降、未作成です。他のネタを片付けたら取りかかります）

次は、githubの操作をやってみます。
[Windows10 + heroku + github + Ruby on Rails 事始め④ github編（2020/02版）](https://qiita.com/miu200521358/items/1e80c2b84bcbe98524f9)