Help us understand the problem. What is going on with this article?

【勉強メモ】Railsマイグレーションの仕組み

More than 1 year has passed since last update.

本記事の目的

  • Railsを勉強した内容のアウトプット
  • Railsを勉強していく中でマイグレーションの仕組みを理解していなかったため自分用のメモ

マイグレーションとは?

  • テーブルレイアウトを作成・変更するための仕組み
  • SQLを書くことなくテーブルの作成やカラムを追加したりすることができる

なぜSQLを書く必要がないのか

  • ActiveRecordがマイグレーションファイルに書かれたい内容をSQLに翻訳(?)し実行する

処理のイメージ

スクリーンショット 2019-03-24 20.27.21.png

  • schemaテーブルには実行ずみのマイグレーションをタイムスタンプで管理している
    • 実行ずみのマイグレーションファイルのタイムスタンプが記録
  • railsコマンドのdb:migrateで見実行のマイグレーションファイルを自動的に認識し処理を実行

マイグレーションファイルについて

マイグレーションファイルとは?

  • テーブルを作る際のDBの設計書
  • マイグレーションファイルの内容に基づいてテーブルが作成される

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

  • Model作成と同時に行う場合とマイグレーションファイル単体で作成する場合がある
    • 新規にテーブルを作成する際にはmodel作成と一緒に行う
    • すでに存在するテーブルに対してレイアウトの修正を行う場合はマイグレーションファイル単体を作成する

model作成時にマイグレーションファイルを作成

model作成と一緒に作成
rails generate model book isbn:string title:string price:integer publish:string published:date dl:boolean

既存のテーブルに対して変更を加えるマイグレーションファイルを作成

  • 行う処理クラス名で記述する
マイグレーションファイル単体
rails generate migration AddColumnBooks
  • Modelと一緒に作成される例しか見たことないけどマイグレーションファイルのみ作成する場合もある

 マイグレーションファイルの中身

class CreateBooks < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.string :isbn
      t.string :title
      t.integer :price
      t.string :publish
      t.date :published
      t.boolean :dl

      t.timestamps
    end
  end
end
  • AcativeRecord::Migraionを継承する
  • changeメソッドでスキーマの操作を定義している

create_tebleメソッド

   create_table :books do |t|
      t.string :isbn
      t.string :title
      t.integer :price
      t.string :publish
      t.date :published
      t.boolean :dl

      t.timestamps
    end
  • SQLのCREATE TABLE命令になる
  • t.[データ型]でテーブルに属するフィールドを定義
  • 主キーはデフォルトでidが自動生成される

t.[データ型]で定義できるデータ型

マイグレーションファイルの記述(t.[データ型]) SQLite
integer INTEGER
decimal DECIMAL
float FLOAT
string VARCHAR(256)
text TEXT
binary BLOB
date DATE
datetime DATETIME
timestamp DATETIME
time TIME
boolean BOOLEAN

列制約の定義

  • カラムに入力されるデータに対して制約を与えることができる
  • 制約名:値の形で定義できる
制約の例
class CreateBooks < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.string :isbn, limit:17, null:false
      t.string :title, limit:100, null:false
      t.integer :price, precision:5, scale: 0
      t.string :publishm, limit:20, default: 'BOOKS!!'
      t.date :published
      t.boolean :dl

      t.timestamps
    end
  end
end

マイグレーションの実行

マイグレーション実行コマンド
[vagrant@default railsbook]$ rails db:migrate
  • コマンドを実行するとマイグレーションファイルに基づいてテーブルが作成(更新)される
  • postgresの場合のマイグレーション実行後

マイグレーション実行後のスキーマ

  • created_atとupdated_atは自動的に付与される
    • 生成された時のタイムスタンプとデータが更新された時のタイムスタンプ
マイグレーション実行後のテーブルスキーマ
railsbook_development=# \d books
                                     Table "public.books"
   Column   |            Type             |                     Modifiers
------------+-----------------------------+----------------------------------------------------
 id         | bigint                      | not null default nextval('books_id_seq'::regclass)
 isbn       | character varying           |
 title      | character varying           |
 price      | integer                     |
 publish    | character varying           |
 published  | date                        |
 dl         | boolean                     |
 created_at | timestamp without time zone | not null
 updated_at | timestamp without time zone | not null
Indexes:
    "books_pkey" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "reviews" CONSTRAINT "fk_rails_924a0b30ca" FOREIGN KEY (book_id) REFERENCES books(id)

まとめ

  • マイグレーションファイルに記述された内容に基づいてActiveRecordがSQLに翻訳してテーブルの作成と更新を行う
  • migrationファイルにはカラムの定義が記述されている

所感

  • 今までの経験では直接DBにアクセスしてテーブルを作っていたためマイグレーション機能の便利さに感動した
  • ただしSQLの知識が必要であることに違いはないため、もっと勉強をしていきたい
wara1120
新卒2年目でSierを退職した駆け出しWebエンジニアです。
https://turedure-everyday.hatenadiary.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした