Railsでstructure.sqlがやたらコンフリクトするとき
config.active_record.schema_format = :sqlにしたとき、DBがMySQLだと(そうでない場合もなるかもだけど)db:migrate:resetしたりすると、dumpのタイミングでタイムスタンプがずれるのでこんな感じの残念な差分が生まれる。
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2015-01-05 12:17:15
+-- Dump completed on 2015-01-06 10:47:36
INSERT INTO schema_migrations (version) VALUES ('20140902084054');
INSERT INTO schema_migrations (version) VALUES ('20140903074012');
これをイチイチ手作業で対応するのはやってらんないし、この情報が重要だともあまり思えなかった(gitの履歴を追えばだいたいわかるし)ので、dumpのタイミングで消してしまうことにした。
具体的には以下の処理を書いた。
lib/tasks/dump.rake
namespace :db do namespace :structure do task :dump do path = Rails.root.join('db', 'structure.sql') sql = File.open(path).read.gsub(/^-- Dump completed on.*\n/, '').gsub(/-- Server version.*\n/, '') File.open(path, 'wb') {|f| f.puts sql } end end end
この例ではServer versionも消している。マイナーバージョンとか開発者によって微妙に違ったりするのでこれも消した(バージョンを合わせたほうがいいとは思うけど)