当我使用任务运行这段代码时,它可以正常工作
task :importGss => :environment do
Gss.delete_all
file = Rails.root + "app/assets/CSVs/gss.csv"
csv_text = File.read(file)
puts csv_text.size
csv = CSV.parse(csv_text, :col_sep => ';', :headers => true)
csv.each do |row|
Gss.create!(row.to_hash)
end
当我使用MVC运行它时,我有以下消息:
ActiveRecord :: StatementInvalid(SQLite3 :: BusyException:数据库被锁定:
我已将上述代码放在Gss模型的函数中。 导入从浏览器启动,带有GET,该GET路由到调用模型导入功能的控制器 导入完成后,应将完整的记录列表返回到视图。 csv文件有4k行。 导入过程需要时间,似乎在60秒后GET重新发送。 有人可以解释一下如何避免重新导致导致崩溃的重新发送吗?
答案 0 :(得分:4)
在事务中包装它将确保所有查询将一起运行,而不是一次运行1。这将大大减少执行该行的导入所花费的时间。
task :importGss => :environment do
Gss.delete_all
file = Rails.root + "app/assets/CSVs/gss.csv"
csv_text = File.read(file)
puts csv_text.size
csv = CSV.parse(csv_text, :col_sep => ';', :headers => true)
ActiveRecord::Base.transaction do
csv.each do |row|
Gss.create!(row.to_hash)
end
end
end
在此处详细了解交易:http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html