将CSV导入现有的sqlite数据库表

时间:2013-03-13 21:44:33

标签: ruby-on-rails-3 csv import sqlite rake-task

我在这个论坛上搜索了上述问题的解决方案,但我尝试的一切都没有用。基本上,我有一个模型库,在我的sqlite3数据库中有相应的库表。我有一个名为libraries.csv的csv文件,其中包含我要导入数据库的所有数据。

我在this page的第二个答案上尝试了这个方法,但它仍然无效。我确保在lib / tasks文件夹中创建我的rake文件'import_libraries.rake,我还将libraries.csv文件保存在该文件夹中,但我不断收到此错误消息:

  耙子中止了!
  不知道如何构建任务'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

但是当我运行bundle exec rake import_libraries时,我收到上面的错误信息。

我做错了什么吗?我很感激你的帮助。感谢

修改

我将rake文件从import_libraries.rake重命名为import.rake在运行bundle exec rake import时,我现在得到的错误信息是:

  耙子流产了! UTF-8中的无效字节序列   C:/Users/username/rails_app_name/lib/tasks/import.rake:4:在`block in   '任务:TOP => import(通过运行任务查看完整跟踪   与--trace)

2 个答案:

答案 0 :(得分:1)

根据您所获得的错误以及您定义的任务,您应该致电:

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

使用rake,您可以根据您为任务指定的名称调用task,而不是根据文件名称调用(请记住,每个rake文件中都有许多任务)。

答案 1 :(得分:0)

我终于通过使用此代码解决了这个问题:

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