テーブル設計・マイグレーション

はじめに

データベースにポートフォリオサイト管理者(ご自身)の情報を保存するためにテーブルを作成します。

アプリケーションの全体像を把握するためにテーブルの構造をドキュメントとして残していると便利です。ER図の作成から行います。ER図ができているとこれからコードを書き始めるハードルもぐっと下がります。

ゴールの確認

ER図を作成する

DBMSをインストールしてデータベースと接続させる

usersテーブルを作成する

Userモデルを作成する

コンソールからデータが作成できることを確認する

ここで実装している内容については私のgithubに載せているのでわからなくなった際には参考にしてみてください

ER図を作成

アプリケーションの設計や全体像を把握するためのドキュメントとしてER図を作成しておくと便利です。また、これから開発するアプリケーションや機能のテーブルのリレーションをよく練っておくと手戻りが少なくて済むように思います

ER図を作成するためのツールはいくつかありますが、私はdrawioをよく利用します。
drawioはgoogleドライブから無料で作成できてそのままドライブに保存することができるため便利です。
また、ER図以外にもインフラ構成図やフローチャートなどあらゆる作図も可能なため設計のドキュメント作成ツールとしてもよいです

drawioの準備

googleドライブを開き、新規>その他のアプリ>アプリ追加を選択

無事に開くことができたら作図のサンプルからER図を選択しましょう。
テンプレートが用意されているのでこれをベースにアプリケーションのドキュメントを編集していきます

ここではusesテーブルをまず設計していきます。
usersテーブルにはポートフォリオ管理者の情報を保存します。
これをみた人があなたにオファーをすることができるように、名前・メールアドレス・住所・郵便番号を入力できるようにしましょう。

ER図に起こすとこのようになりました

PKはprimary keyの略です。ここにはないですが、user_idのように外部テーブルとのリレーションを示す値を入れる場合にはFK(foreign key)をつけます。

postal_codeにのみ(string)と記載してみました。郵便番号には111-1111か1111111の登録がありえ、前者の場合は文字列。後者の場合は数値で保存ができ、どちらの形式を採用しているか判断に迷うことがありそうなので、型を細くしています。
カラムの型については毎度記載するのも統一的で親切ではありますが、カラム名が長くなるとER図の見通しが悪くなってしまうので、カラム名から値の型の判断が難しそうなものだけ補足してあげる方針にしました。

モデルとマイグレーションファイルの作成

ER図で設計した内容をソースコードに反映していきます

rails g model User

モデル名なので大文字はじまりの単数系を指定します。ここが単数系でも同時に作成されるマイグレーションファイルではテーブル名は複数形で作成してくれます。

このコマンドにオプションとしてカラム名とその型を指定することができますが、カラム名が多くなるとオプションを書いたコマンドを書くことの方が大変なので生成されたファイルに手書きをするスタイルです。

生成されたマイグレーションファイルに追記します

class CreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      t.string :name, null: false, default: ""
      t.string :email, null: false, default: ""
      t.string :postal_code, null: false, default: ""
      t.string :address, null: false, default: ""

      t.timestamps
    end
  end
end

null: false とすることでカラムにNULLが入ってレコードが作成されないようにします。
default: "" とすることでその値を指定しなかったときにnullではなく、空文字列を入れてレコードを作成するようにします。
データベースの中にNULLが入ると何かと不便なことがあるので、NULLに特別な意図を含ませるのでない限り空文字を入れてあげるほうが扱いやすい場面が多いと思います。

DBクライアントツールの導入

マイグレーションファイルができたらrails db:migrateを実行し、テーブルやカラムを作成していくのですが、本当にうまくいっているかを確認するためにDBクライアントツールの設定をしてここから確認したいと思います。
DBクライアントツールを使えると直接DBの操作をすることができ、デバッグは開発のための値操作もしやすく、開発効率が大きく変わるので導入しておくことをおすすめします。

DBクライアントツールはいくつかありますが、ここでは「DBeaver」を使います。
アップデートが頻繁にあり、UIも直感的で使いやすいので気に入っています。

お使いのDBクライアントツールをまだお持ちでない場合はDBeaverのcommunity版をダウンロードしておきましょう

ダウンロードができたらデータベースと接続します。
左上のプラグに+のアイコンから新しい接続を作成します。
DBMSを選択(mysqlを選択)
接続情報を聞かれます。重要な箇所は

Server Host: localhost
Port: 3306
Databse: techport
ユーザー名: root
パスワード: password

です。実際に入力するはDatabaseとpasswordだけかと思います。

入力ができたらまずは左下のテスト接続をしてみましょう。
エラーにならず、接続済みのポップアップが表示されれば成功です。
テストに通ったら終了を選択します。

もしテストに通らない場合は何かしらの設定が違っている可能性があります。これらの設定情報はdocker-compose.ymlやbackend/database.ymlからヒントが得られます
※ユーザー名のrootはどこにも記載はないですが、これはmysqlの仕様でデータベースを作成するときにrootという名前のユーザーが作成されます。docker-compose.ymlでMYSQL_ROOT_PASSWORDの環境変数でrootのパスワードを設定しているため、rootとpasswordの組み合わせでログインできるようにしています。

データベースナビゲータにtechportが追加されるのでそのトグルからテーブルを開きます。
まだ、マイグレーションを実行していませんが、すでにいくつかテーブルが作成されていると思います。これはmysqlが動作するために必要なものやrailsが動作するために必要なテーブルなのでどれも大事なものです。基本的にマニュアルどうこうすることはありません。

マイグレーションの実行

それではマイグレーションを実行しましょう。コマンドは

rails db:migrate

です。マイグレーションコマンドが終了したらDBeaverの先ほどのデータベースの画面を開きます。
すでに開いている場合は更新をしないと反映されません。データベースナビゲータのtechportを右クリックして更新をしてあげましょう。
もう一度テーブル一覧を開き、usersテーブルが追加されていることを確認してください。

rails db:migrateについて

rails db:migrateを実行することでusersテーブルが作成されました。
マイグレーションを実行した後でcreate_usersのマイグレーションファイルを編集してもう一度rails db:migrateを実行しても何も起こりません。

このコマンドは「最後にマイグレーションされた時から現在までに作成されているマイグレーションファイルを特定してそれを実行する」という動きをします。
最後にマイグレーションが実行されたタイミングはschema_migrationsというテーブルで管理され、マイグレーションファイル名に追加された時が書かれています。この二つをみて実行済みマイグレーションファイルかどうかを判定します。

一度マイグレーションが実行されたマイグレーションファイルを編集しその結果を反映させるにはロールバックさせる必要があります。

rails db:rollback

編集したい内容が一つ前どころか、ずいぶん前であったり、いろいろ試しすぎてdbの状態がわからなくなってしまった場合はリセットさせることができます

rails db:migrate:reset

このコマンドはrailsで管理されているデータベースごと削除してからもう一度データベースを立ち上げて一から全てのマイグレーションファイルを実行します。そのため、現在のマイグレーションファイルの中身がまるまる反映されます。

ただし、データベースごと削除されるため、実行前にあった全てのテーブルのレコードは完全に消失します。
開発中のローカルPCのDB環境では大した問題ではありません(せいぜいせっかく入れた開発用データが失われるためもう一度レコードを入れ直すのが大変なくらい)
ですが、本番のデータベースに向けてこのコマンドを実行してしまうと取り返しがつかなくなるので十分注意してください

コンソールからレコードを挿入してみる

それでは最後にrailsのコードをコンソールから実行してデータベースのusersテーブルに値が作成されることを確認しましょう。下記のコマンドでコンソールを開きます

rails c

コンソールを開いたら下記のコードを入れて実行しましょう

User.create(name: "foobar", email: "barbaz@mail.com", postal_code: "111-1111", address: "hoge huga")

成功しましたでしょうか?

User.all

をして先ほどの値のユーザーが取れることを確認してみましょう。また、DBeaverのusersテーブルにもレコードが追加されていることも確認してみましょう(更新することを忘れずに!)

まとめ

ER図の作成から、DBクライアントツールの導入・マイグレーションとモデルの作成をやってきました。

開発の準備が整ってきました。DB操作の方法はRailsに限らずどんなときでも共通なのでぜひマスターしておきましょう。

コメント

タイトルとURLをコピーしました