3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-24

本記事の目的

  • 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の知識が必要であることに違いはないため、もっと勉強をしていきたい
3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?