migration
ファイルの中に特殊な処理があるときなどは、db/schema.rb
ではdbのテーブル構成を忠実に再現出来ないケースが有り、その場合は生のSQLを使うdb/structure.sql
をdumpする方法があります。
こんな感じで設定出来ます。
config/application.rb
module YourApp
class Application < Rails::Application
config.active_record.schema_format = :sql
end
end
このときrake db:schema:load
からrake db:structure:load
に変えたところ、CircleCIにおいて、処理速度が遅くなってしまったので調べていたところ、
bundle exec rake db:structure:dump
の最後のschema_migrations
テーブルの中身をdumpする処理がBULK INSERT
ではなかったので、ちょろっと調整してみました。
config/initializers/extensions/active_record.rb
module ActiveRecord
module ConnectionAdapters
module SchemaStatements
# CircleCIでのINSERTがとにかく遅いのでBulk Insertでschema_migrationsを出力する
def dump_schema_information
sm_table = ActiveRecord::Migrator.schema_migrations_table_name
sql = String.new
sql << "INSERT INTO #{sm_table} (version) VALUES"
sql << ActiveRecord::SchemaMigration.order('version').map { |sm|
"('#{sm.version}')"
}.join(",")
sql << ";\n\n"
end
end
end
end
テーブル数200強、migration数が600弱という環境で、ローカルのmacだと以下ぐらいの差です。
- MacBook Pro (Retina, 15-inch, Mid 2014)
- プロセッサ: 2.2 GHz Intel Core i7
- メモリ: 16 GB 1600 MHz DDR3
before
time bundle exec rake db:structure:load 5.60s user 3.71s system 63% cpu 14.592 total
After
time bundle exec rake db:structure:load 4.46s user 2.05s system 65% cpu 9.973 total
CircleCIだと1分近い差がでました。