diff options
author | Kir Shatrov <shatrov@me.com> | 2017-06-18 11:14:52 -0400 |
---|---|---|
committer | Kir Shatrov <shatrov@me.com> | 2017-06-20 13:18:53 -0400 |
commit | 4ee42379cc30a07a7d47b7be8c710dba0efa407a (patch) | |
tree | 19f5e734b0751771edcb80050524760353928031 /activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb | |
parent | 09cb26bc1e653999827cf3eb955d42a2c932b3f5 (diff) | |
download | rails-4ee42379cc30a07a7d47b7be8c710dba0efa407a.tar.gz rails-4ee42379cc30a07a7d47b7be8c710dba0efa407a.tar.bz2 rails-4ee42379cc30a07a7d47b7be8c710dba0efa407a.zip |
Use bulk INSERT to insert fixtures
Improves the performance from O(n) to O(1).
Previously it would require 50 queries to
insert 50 fixtures. Now it takes only one query.
Disabled on sqlite which doesn't support multiple inserts.
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb index 648c869915..c42e80ea2c 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -526,8 +526,25 @@ module ActiveRecord index.using == :btree || super end + def insert_fixtures(*) + without_sql_mode("NO_AUTO_VALUE_ON_ZERO") { super } + end + private + def without_sql_mode(mode) + result = execute("SELECT @@SESSION.sql_mode") + current_mode = result.first[0] + return yield unless current_mode.include?(mode) + + sql_mode = "REPLACE(@@sql_mode, '#{mode}', '')" + execute("SET @@SESSION.sql_mode = #{sql_mode}") + yield + ensure + sql_mode = "CONCAT(@@sql_mode, ',#{mode}')" + execute("SET @@SESSION.sql_mode = #{sql_mode}") + end + def initialize_type_map(m) super |