aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
diff options
context:
space:
mode:
authorKir Shatrov <shatrov@me.com>2017-06-18 11:14:52 -0400
committerKir Shatrov <shatrov@me.com>2017-06-20 13:18:53 -0400
commit4ee42379cc30a07a7d47b7be8c710dba0efa407a (patch)
tree19f5e734b0751771edcb80050524760353928031 /activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
parent09cb26bc1e653999827cf3eb955d42a2c932b3f5 (diff)
downloadrails-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.rb17
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