📕

Railsのschema_migrationsってなんぞや

2022/03/09に公開

migrationの仕組みってなんとなく、日付順に実施してくれるくらいの認識だったので、今回は少し深堀ってみようと思います!

まずは、scaffoldで簡単なアプリ雛形を作成し、合わせてdb:createも実行します。

$ rails g scaffold Post title:string body:text
$ rails db:create

$ rails db コマンドを使用して、テーブル一覧を確認します。
まだ、$ rails db:migrate していないのでなにも表示されないはずです。

$ rails db
SQLite version 3.32.3 2020-06-18 14:16:19
Enter ".help" for usage hints.
sqlite> .tables
sqlite>

$ rails db:migrate実行前にマイグレーションファイルを確認してみます。

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end

$ rails db:migrateを実行します。

$ rails db:migrate
== 20220309061023 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0036s
== 20220309061023 CreatePosts: migrated (0.0036s) =============================

ここでもう一度DBを確認すると...

schema_migrationsを発見しました!!

$ rails db
SQLite version 3.32.3 2020-06-18 14:16:19
Enter ".help" for usage hints.
sqlite> .tables
ar_internal_metadata  posts                 schema_migrations

schema_migrationsをもう少し見てみると、先程のマイグレーションファイルの日付情報が入ってることがわかります。

sqlite> .tables
ar_internal_metadata  posts                 schema_migrations
sqlite> select * from schema_migrations;
20220309061023

The table schema_migrations contain one column with one entry that is the unique id of the file that was created. Coincidence ? I don’t think so, rails actually does book keeping of all the migrations that had already run by keeping an entry of the unique id in this table.

参考記事より引用させていただきました.

簡単な翻訳をかけると...

$ rails db:rollbackで最後に実行された移行ファイル(最後の移行ファイル)をロールバックして、schema_migrationsの中身を確認してみます。

$ rails db:rollback
== 20220309061023 CreatePosts: reverting ======================================
-- drop_table(:posts)
   -> 0.0144s
== 20220309061023 CreatePosts: reverted (0.0225s) =============================

schema_migrationsが殻になっていることがわかります。

sqlite> .tables
ar_internal_metadata  schema_migrations
sqlite> select * from schema_migrations;
sqlite>

$ rails db:migrateをもう一度実行することで、schema_migrationsに同じ値が追加されます。

まとめ

migrationファイルは日付情報で判断して、 schema_migrationsに値がないものを実行するようになっているっぽいです!

参考記事

https://tushartuteja.medium.com/demystifying-rails-migrations-53abcf3a7ddd

Discussion