Импорт CSV в существующую таблицу базы данных sqlite

Я искал по всему форуму решение вышеуказанной проблемы, но все, что я пробовал, не сработало. По сути, у меня есть модельная библиотека с соответствующей таблицей библиотек в моей базе данных sqlite3. У меня есть CSV-файл с именем library.csv, который содержит все данные, которые я хочу импортировать в базу данных.

Я попробовал метод во втором ответе на this страница, но она по-прежнему не работает. Я позаботился о том, чтобы создать файл rake import_libraries.rake в папке lib/tasks, а также сохранил в этой папке файл library.csv, но я продолжаю получать это сообщение об ошибке:

rake aborted!
Не знаю, как построить задачу 'import_libraries' (см. полную трассировку, запустив задачу с параметром --trace)

Это текущий код, который я использую:

require 'csv'
desc "Imports a CSV file into an ActiveRecord table"
task :import, [:filename] => :environment do    
    CSV.foreach('libraries.csv', :headers => true) do |row|
      Library.create!(row.to_hash)
    end
end

Но когда я запускаю пакет exec rake import_libraries, я получаю указанное выше сообщение об ошибке.

Есть ли что-то, что я делаю неправильно? я был бы признателен за вашу помощь, ребята. Спасибо

ИЗМЕНИТЬ

Я переименовал файл rake из import_libraries.rake в просто import.rake. При запуске импорта rake exec пакета я получаю сообщение об ошибке:

рейк прерван! неверная последовательность байтов в UTF-8 C:/Users/username/rails_app_name/lib/tasks/import.rake:4:in `block in ' Tasks: TOP => import (см. полную трассировку, запустив задачу с --trace)


person Shikasan    schedule 13.03.2013    source источник
comment
Не могли бы вы опубликовать текущий код, который вы пытаетесь?   -  person fmendez    schedule 14.03.2013
comment
Мне жаль. Я только что отредактировал свой вопрос, чтобы включить код сейчас   -  person Shikasan    schedule 14.03.2013
comment
Не могли бы вы опубликовать несколько строк файла .csv?   -  person fmendez    schedule 14.03.2013
comment
Попробуйте добавить эту строку в начало файла import.rake: # encoding=utf-8   -  person fmendez    schedule 14.03.2013


Ответы (2)


В зависимости от полученной вами ошибки и задачи, которую вы определили, вы должны звонить:

bundle exec rake import  #=> you're currently calling import_libraries which indeed doesn't exist

С помощью rake вы вызываете task на основе имени, которое вы даете задачам, а не имени файла (помните, что вы можете иметь много задач внутри каждого из этих rake-файлов).

person fmendez    schedule 13.03.2013
comment
Привет фмендес. Должен ли я в этом случае переименовать мой файл rake в импорт? - person Shikasan; 14.03.2013
comment
Не обязательно. Вы можете назвать этот файл любым именем (оно должно быть в lib/task). Вы должны, для ясности, дать ему описательное имя. Когда дело доходит до выполнения задачи rake, важно, чтобы вы использовали имя, назначенное ей в task :name_you_assign_to_the_task внутри файла .rake. - person fmendez; 14.03.2013
comment
Привет. Пожалуйста, ознакомьтесь с новым сообщением об ошибке, которое я сейчас получаю. Спасибо - person Shikasan; 14.03.2013

Я, наконец, решил проблему, используя этот код:

namespace :csv do

  desc "Import CSV Data"
  task :import => :environment do

    require 'csv'

    csv_file_path = 'lib/tasks/libraries.csv'

    CSV.foreach(csv_file_path, headers: true) do |row|
      row = Library.create!({
        :column_name1 => row[0],
        :column_name2 => row[1],
        :column_name3 => row[2],
        .
        . 
        :last_column => row[6]
      })
      puts "Success!"
    end
  end
end
person Shikasan    schedule 13.03.2013