我有一些种子数据可以在我的开发设置中创建1000个用户。有时我会在开发过程中使用以下命令重置我的数据库:
rake db:reset
它以大约10个用户/秒的速率插入我的用户。我认为这很慢,但学会了忍受它。
我最近在测试环境中运行db:reset
,同时使用此命令调试一些rspec测试:
rake db:reset RAILS_ENV=test
它以大约 100个用户/秒插入用户!我可以重现它并在环境之间交替,并且开发环境很慢,而测试环境很快。
它使用database.yml
中完全相同的mysql设置:
开发
development:
adapter: mysql2
encoding: utf8
database: mydb
username: mydb
password: password
host: 127.0.0.1
port: 3306
测试
development:
adapter: mysql2
encoding: utf8
database: mydb_test
username: mydb_test
password: password
host: 127.0.0.1
port: 3306
这就是我为用户播种的方式(两种环境都相同):
ActiveRecord::Base.transaction do
1000.times do |i|
User.create :first_name => Faker::Name.first_name, :last_name => Faker::Name.last_name, :email => Faker::Internet.email, :username => Faker::Internet.user_name, :password => '123456'
end
end
有谁知道rails正在做什么来让测试环境如此之快?我想在开发环境中实现这些设置,并将我的播种过程加速10倍。
答案 0 :(得分:1)
我想在开发环境中实施这些设置,并将播种过程加快10倍。
底线是,如果您想立即插入太多数据,则不应考虑使用rails方法。我遭受了它.Rails附加了太多回调,如before_update, after_create
等。我每个数据都插入500K数据。我们使用原始sql来加速这个过程。我们做了类似的事情
ActiveRecord::Base.transaction do
inserts = []
TIMES.times do
inserts.push "(3.0, '2009-01-23 20:21:13', 2, 1)"
end
sql = "INSERT INTO user_node_scores (`score`, `updated_at`, `node_id`, `user_id`) VALUES #{inserts.join(", ")}"
User.connection.execute s
end
答案 1 :(得分:1)
如果您使用的是Devise,则可能是密码拉伸造成的。在config / initializers / devise.rb中:
# Limiting the stretches to just one in testing will increase the performance of
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
# a value less than 10 in other environments.
config.stretches = Rails.env.test? ? 1 : 10
这似乎是您正在寻找的开发和测试环境之间的差异。尝试使用此行