2016-09-29 4 views
1

Когда я запускаю этот кусок кода с задачей, он работаетSQLite3 :: BusyException: база данных заблокирована: INSERT INTO

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 импорт запускается из браузера с ГЭТ, который направляется к. контроллер, который вызывает функцию импорта модели Когда импорт завершен, полный список записей затем должен быть возвращен в представление. Файл csv имеет 4k строк. Процесс импорта занимает много времени, и кажется, что через 60 секунд GET отправляется повторно. Может ли кто-нибудь объяснить мне, как избежать повторной отправки, что приводит к сбою импорта?

ответ

4

Обернуть его в транзакцию, чтобы убедиться, что все запросы будут выполняться вместе, а не по одному за раз. Это значительно сократит время, затрачиваемое на выполнение импорта для этого количества строк.

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

+0

Спасибо! Это работает. Как насчет такого таймаута, который отправляет GET? Есть ли способ избежать этого? – user3239711

+0

Я не знаю ни одного, я не думаю, что сервер контролирует i.e клиентскую сторону? Хотя я не уверен. Действие длится менее 60 секунд, хотя верно? – RichardAE

+0

Да, но если мне нужно загрузить файлы lager? Интересно, приходит ли он из браузера. И в этом случае, можно ли проверить факт, что база данных занята, чтобы избежать столкновения – user3239711

Смежные вопросы