SQLite3 :: BusyException:数据库被锁定:INSERT INTO

时间:2016-09-29 14:34:50

标签: ruby-on-rails sqlite

当我使用任务运行这段代码时,它可以正常工作

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重新发送。 有人可以解释一下如何避免重新导致导致崩溃的重新发送吗?

1 个答案:

答案 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