【问题标题】:Not able to import csv to MySQL db in Ruby on Rails 3无法在 Ruby on Rails 3 中将 csv 导入 MySQL 数据库
【发布时间】:2012-07-16 17:07:43
【问题描述】:

我正在通过 Ruby on Rails 3 将数据从 CSV 文件导入 MySQL db。客户模型已经创建。此外,下面的脚本将正确生成 puts row[2] 和 puts row[3]。当我为customers.warranty_part_no 和warranty_part_desc 的数据库字段添加分配时,它会产生以下错误。

csv = CSV.read(file, col_sep: ",", headers: false)

c = Customer.new  
csv.each do |row|
        c.warranty_part_no = row[2],
        c.warranty_part_desc = row[3]
end

这是我得到的错误。

uninitialized constant Customer (NameError)

经过一些测试,我认为这个问题是因为我从命令行运行这个脚本,所以 customer.rb 模型没有被更大的 rails 应用程序执行,因此永远不会创建 Customer 类。如何从命令行运行此脚本并利用 ActiveRecord 或 activerecord-import?如果这不可能,我该如何为其创建路线或从应用程序的视图中调用它?

我使用的是 Ruby 1.9.2 和 Rails 3.2.2。提前感谢您的任何建议。

【问题讨论】:

  • 为什么不使用 MySQL LOAD DATA INFILE ...?见:dev.mysql.com/doc/refman/5.1/en/load-data.html
  • 是的,我将它用于其他几项任务。我只保留了这个文件中的几个字段。此外,这也将成为屏幕上的一种形式。
  • 您是否尝试过在运行导入之前加载应用程序 (require 'config/environment')?丑陋,但应该让你的模型启动......

标签: mysql ruby ruby-on-rails-3


【解决方案1】:

这里有两种方法可以解决这个问题

 #myscripy.rb
 # add following in your script
 require 'rubygems'
 require 'active_record'
 require YOUR_DB_ADAPTER_GEM #'mysql2', 'pg'
 require PATH_TO_YOUR_MODEL

 csv = CSV.read(file, col_sep: ",", headers: false)

 c = Customer.new  
 csv.each do |row|
    c.warranty_part_no = row[2],
    c.warranty_part_desc = row[3]
 end
 c.save

否则你可以简单地编写 rake 任务(最好在同一个 RailsApp 中)

require 'csv'
 namespace :import do
 task :csv_file => :environment do
  csv = CSV.read(file, col_sep: ",", headers: false)

   c = Customer.new  
   csv.each do |row|
    c.warranty_part_no = row[2],
    c.warranty_part_desc = row[3]
   end
   c.save
  end
end

当您在 RailsApp 中时,可以从命令行调用 rake import:csv_file

如果您对此有任何疑问,请评论我。

【讨论】:

    【解决方案2】:

    正如您所发现的,问题在于您的 Rails 环境没有加载。您可以在独立脚本中执行此操作,方法是包含您的 Customer 模型、active_record,并使用您的 database.yml 建立连接。

    不过,还有一种更简单的方法。像这样创建一个 rake 任务:

    namespace :data do
      desc "Import data from CSV"
      task :import => :environment do
        #Your script here
      end
    end
    

    => :environment 告诉 rake 加载 Rails,这样您的数据库连接和所有模型就可以供您使用。

    使用rake data:import 调用它,如果需要生产环境,请添加RAILS_ENV=production

    【讨论】:

      【解决方案3】:

      我相信您正在寻找的是 rails runner Rails Command Line Docs 它将在您的 rails 应用程序环境中执行您的 ruby​​ 脚本。

      如果您只想在交互式命令 shell 中访问您的 rails 对象,您也可以使用 rails 控制台。通过 rails 控制台

      【讨论】:

        【解决方案4】:

        您也可以只要求您的 config/environment.rb 来访问您的模型。

        【讨论】:

          【解决方案5】:

          解决您的问题

          您的问题似乎是您的 Rails 环境在脚本启动时未加载。

          要正确初始化 Rails 环境,您需要:

          更容易导入 CSV 的附注

          我一直觉得将 CSV 文件作为 Arrays of Arrays 处理是非常笨拙的。

          所以我编写了一个小方法“process_csv”,它将 CSV 文件中的每一行作为哈希返回 - 更适合创建 ActiveRecord 或 Mongoid 记录。

          您可以使用以下代码,并将其放在 ./config/initializers/process_csv.rb 下,并将一个块传递给 process_csv 以为 CSV 文件中的每一行创建一条消费者记录。

          您可以使用 :key_mapping 选项将 CSV 列重命名为 ActiveRecord 模型的正确属性名称,还可以从结果哈希中删除 CSV 键。

          这里有详细的 cmets 的源代码:

          http://www.unixgods.org/~tilo/Ruby/process_csv_as_hashes.html

          例如:

          require 'process_csv'
          
          File.process_csv( file ) do | hash |
             Consumer.create( hash )
          end
          

          享受吧!

          【讨论】:

            猜你喜欢
            • 2012-02-14
            • 1970-01-01
            • 2012-10-11
            • 1970-01-01
            • 1970-01-01
            • 2011-05-23
            • 2017-08-21
            • 2011-09-12
            • 1970-01-01
            相关资源
            最近更新 更多