LoginSignup
9
2

More than 5 years have passed since last update.

Railsから外れたmigrationを再びRailsに乗せる

Last updated at Posted at 2017-03-15
1 / 29

Railsから外れたmigrationを再びRailsに乗せる

渋谷.rb[:20170315]
kaiba @ twitter
お金がなくて居酒屋北海道には行けない :weary:


注意

このスライドは個人の見解であり、関連する組織・業務とは無関係です。


Railsのmigrationとは?

  • RubyっぽくDB定義の変更を書ける
    • rails g migration xxxx
    • db/migrate/20170314123456_xxxx.rb
  • DB環境構築、gitで管理

migrationの仕組み

image


メリットは大きい! Railsに乗るなら是非使いたい機能の一つ!


しかし


rake db:migrateを叩かずalter tableでお願いします。


どうしてこうなった?


migrationを知らなかった?

  • migration知ってたけどalter table叩いちゃった?
  • 知ってる人はいたけど、知らない人が叩いちゃった?
  • Railsを効果的に使うには使い方を知ってないと難しい
  • 実は他の言語で作られたDBを持ってきた?

再びmigrationできるようにしたい


作業手順

  1. 開発環境で新規にrake db:create db:migrateして作り、migrationから作られるテーブル定義を得る
  2. 現状の本番環境のテーブル定義を得る
  3. 1,2を比較する
  4. なんとかして、db:migrateの結果が、本番と一緒なるように頑張る

テーブル定義の比較(MySQLの場合)


開発環境にて

mysql -uxxxx -p information_schema -e "
select * from COLUMNS 
where TABLE_SCHEMA = 'dev_db';" > dev_db.txt
  • information_schema に全部入ってる

本番環境にて

mysql -uxxxx -p information_schema -e "
select * from COLUMNS 
where TABLE_SCHEMA = 'prod_db';" > prod_db.txt

男は黙ってdiff

diff -u dev_db.txt prod_db.txt

…だとちょっと辛いのでGUI

macだとXcodeのFileMergeが好き。
WindowsだとWinMergeが好き。
diff.png


ここまではよいが…

a_1567078_5245a8140f14c5f93ce197812d1b171a4fa9bbaa_jpg.jpg


方針を決める。気持ちを作る。

  • 本番が正しいだろ…だって動いてるし…という気持ちを強く持つ。
  • だいじょうぶなんじゃないかな。たぶんだいじょうぶだろ。

足りないmigration

migrationを作ってやる。
indexがない、制約がない、型が違う、エンコードが違う、など…。


実行されてないmigration

  • 強い意志で基本捨てる。migrationファイルを消す。

実行されてないmigrationだけど…

  • 本番に反映したほうが良いやつはalter table実行
  • メモっといて別のバグ対応としてやるのも良いと思う

何度も rake db:resetを行い、差分がないことを確認していく


差分がなくなったら、開発環境のschema_migrationsの内容を本番環境に入れてやる

  • migration実行済みの状態にしてやる
insert into schema_migrations
(versions) values
(20170123...),(20170124...),(20170125...);

migration職人の夜は遅い

  • 単調だが集中力のいる作業
  • 精神的負担(ミスったらサービスが死ぬ可能性もある)
  • こうしてひとつひとつ丁寧に作られたmigrationファイルには温かみがある。

どうしてこうなった?しないためには

  • Railsチュートリアルやる
  • レビューする
  • 誰でもDBにalter tableできる状態にしない

Thanks!

Shibuya.rb


逆にQuestion

  • RailsじゃないアプリのDBをRailsでも見たい。
  • そんなことしちゃダメ?

image


勉強会あとにもらったアドバイス

  • 本番が正ならrake db:schema_dumpというのがあり、本番のmigrationを作り、それをガッと正としてしまうのもいいかも。
  • RailsのDBは、id、updated_at、created_atは必須ではない。RailsじゃないDBを見るのもありだと思う。
9
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
9
2