ryota21silvaの技術ブログ

Funna(ふんな)の技術ブログ

これまで学んだ技術の備忘録。未来の自分が救われることを信じて

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

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

データベースの設計図。
マイグレーションファイルを実行すれば、マイグレーションファイルを元にDBが作成される。
マイグレーションファイルを作成しただけではDBに反映されない。

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

rails g migration マイグレーション名
rails generate model モデル名 カラム名:型 カラム名:型
$ be rails g model ApiKey user:references access_token:string expires_at:datetime    
Running via Spring preloader in process 47115
      invoke  active_record
      create    db/migrate/20200719073831_create_api_keys.rb
      create    app/models/api_key.rb
      invoke    rspec
      create      spec/models/api_key_spec.rb
      invoke      factory_bot
      create        spec/factories/api_keys.rb

マイグレーションファイルを実行

dbにマイグレーションファイルの内容が反映された。

$ be rails db:migrate  
== 20200719073831 CreateApiKeys: migrating ====================================
-- create_table(:api_keys)
   -> 0.0065s
-- add_index(:api_keys, :access_token, {:unique=>true})
   -> 0.0020s
== 20200719073831 CreateApiKeys: migrated (0.0091s) ===========================

DBに反映されているマイグレーションファイルを確認する

upと書いているファイルがデータベースに反映されているもの(マイグレーション済みということ)

$ rails db:migrate:status

database: db/learning_api_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200627072315  Sorcery core
   up     20200627073523  Create social profiles
   up     20200627074538  Create articles
   up     20200627075238  Create comments
   up     20200719073831  Create api keys

スキーマファイルで現在のDBの構造を確認する

マイグレーションファイルの内容をDBに反映されていない状態に戻す

rails db:rollbackで、最新のマイグレーションファイルをdown状態にできる。
down状態のマイグレーションファイル = データベースに反映されていない状態にあるということ。
※up状態にあるマイグレーションファイルを削除・編集することは避けよう。

rails db:rollback

be rails db:reset

全てのテーブルを dropし、"db/schema.rb"を元にテーブルの再作成を行う。レコードは空になる。

be rails db:migrate:reset

migrateとresetを両方行う。

$ be rails db:migrate:reset   
                                                                                                                                   
Dropped database 'db/runteq_curriculum_learning_api_development.sqlite3'
Dropped database 'db/runteq_curriculum_learning_api_test.sqlite3'
Created database 'db/runteq_curriculum_learning_api_development.sqlite3'
Created database 'db/runteq_curriculum_learning_api_test.sqlite3'
== 20200627072315 SorceryCore: migrating ======================================
-- create_table(:users)
   -> 0.0037s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0021s
== 20200627072315 SorceryCore: migrated (0.0060s) =============================

== 20200627073523 CreateSocialProfiles: migrating =============================
-- create_table(:social_profiles)
   -> 0.0093s
== 20200627073523 CreateSocialProfiles: migrated (0.0094s) ====================

== 20200627074538 CreateArticles: migrating ===================================
-- create_table(:articles)
   -> 0.0058s
== 20200627074538 CreateArticles: migrated (0.0059s) ==========================


$ rcs 
                         
Running via Spring preloader in process 60310
Loading development environment in sandbox (Rails 6.0.2.1)
Any modifications you make will be rolled back on exit
[1] pry(main)> User.first
   (0.3ms)  begin transaction
  User Load (0.5ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> nil

be rails db:seed

Seedファイルのデータを、テーブルのレコードに投入

$ be rails db:seed                                                                                                                                                                      
$ rcs                                                                                                                                                                         
Running via Spring preloader in process 60874
Loading development environment in sandbox (Rails 6.0.2.1)
Any modifications you make will be rolled back on exit

[1] pry(main)> User.first
   (1.7ms)  begin transaction
  User Load (0.4ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User:0x00007fb1841d4808
 id: 1,
 name: "user-1",
 email: "user-1@example.com",
 crypted_password: "$2a$10$FWgdOQ7TTpcNzgGVxhRLfus46sJg8WP3DPi0yvj4U72rH7RW0PMxa",
 salt: "8QYWYUM7Vb-yp44eVzBP",
 created_at: Sun, 19 Jul 2020 08:06:58 UTC +00:00,
 updated_at: Sun, 19 Jul 2020 08:06:58 UTC +00:00>