schema.rb
よく間違って運用されているのでまとめ
まとめ
schema.rbは現在のDBのスキーマがダンプ(db:schema:dump task) されたものである
rails db:migrateした後にスキーマがダンプされる
ローカル環境・CIのセットアップではdb:setupタスクを実施するのが一般的。これはdb:schema:load taskを実施するため、schema.rbからデータベースを構築する。migrationファイルを1から実行することはない
したがって、schema.rbを本番のDBのスキーマと常に等しくしておくことが重要。
手でいじるのはNGです
アイデア
付録
db:migrate で起きること
root@3d369033e46d:/stamps# bin/rake db:migrate --trace
** Invoke db:migrate (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:load_config
** Execute db:migrate
** Invoke db:_dump (first_time)
** Execute db:_dump
** Invoke db:schema:dump (first_time)
** Invoke db:load_config
** Execute db:schema:dump
migrateした後に db:schema:dumpされる
db:setup で起きること
root@3d369033e46d:/stamps# bin/rake db:setup --dry-run --trace
** Invoke db:setup (first_time)
** Invoke db:create (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute (dry run) environment
** Execute (dry run) db:load_config
** Execute (dry run) db:create
** Invoke environment
** Invoke db:schema:load (first_time)
** Invoke db:load_config
** Invoke db:check_protected_environments (first_time)
** Invoke db:load_config
** Execute (dry run) db:check_protected_environments
** Execute (dry run) db:schema:load
** Invoke db:seed (first_time)
** Invoke db:load_config
** Execute (dry run) db:seed
** Execute (dry run) db:setup
db:create -> db:schema:load -> db:seedされる。 db:migrateは実施されない。