Ruby on rails 将CSV文件导入Sqlite3-处理已创建、已更新列的最简单方法?

Ruby on rails 将CSV文件导入Sqlite3-处理已创建、已更新列的最简单方法?,ruby-on-rails,ruby-on-rails-3,sqlite,Ruby On Rails,Ruby On Rails 3,Sqlite,我有一个CSV文件,我正试图使用.import命令导入Sqlite3。db表已经更新了_at和创建了_at列,但我的CSV文件没有更新,因此当我运行导入时,会收到一条错误消息:“预期为18列,仅找到16列” 导入此文件的最简单方法是什么 我尝试将created_at、Update_at列添加到CSV文件中,但出现错误 有几个论坛建议使用FasterCSV,但我不清楚如何使用gem专门解决这个问题。如果在处创建的值和在处更新的值按如下方式添加到CSV中,.import xyz.CSV xyz应正确

我有一个CSV文件,我正试图使用.import命令导入Sqlite3。db表已经更新了_at和创建了_at列,但我的CSV文件没有更新,因此当我运行导入时,会收到一条错误消息:“预期为18列,仅找到16列”

导入此文件的最简单方法是什么

我尝试将created_at、Update_at列添加到CSV文件中,但出现错误


有几个论坛建议使用FasterCSV,但我不清楚如何使用gem专门解决这个问题。

如果在处创建的
值和在
处更新的
值按如下方式添加到CSV中,
.import xyz.CSV xyz
应正确导入数据

... | "2013-02-10 15:17:17" | "2013-02-10 15:17:17"
以这种方式导入时会出现什么错误

当您使用库导入数据时,导入通过ActiveRecord界面进行,该界面会自动添加
created_at
updated_at
字段,就像从GUI添加记录一样

查看代码示例的答案


有关使用该库的信息,请参阅

来,威廉,试试这段代码。将CSV导入数据库是Ruby代码,忽略在创建时和更新时的CSV

要运行它,请执行以下操作:

  • 将代码粘贴到新文件中。我们称之为import.rb
  • 编辑文件。将
    self.table\u name=“mytablename”
    中的“mytablename”一词更改为要导入的表的实际名称
  • 在文件末尾,用Sqlite3文件的实际名称替换mydb.db。它应该是文件的相对路径(相对于import.rb)
  • 在命令行上,键入:

    gem install active_record sqlite3
    ruby import.rb path/to/csvfile.csv
    
  • (如果您在Mac上,请使用“sudo gem install”而不仅仅是“gem install”。)

    好的,下面是代码:


    需要“rubygems”
    需要“csv”
    需要“活动记录”
    需要'sqlite3'
    ActiveRecord::Base.configurations=YAML::load(数据)
    ActiveRecord::Base.建立\u连接('开发')
    类记录数据库:mydb.db#我解决了这个问题,我重新创建了一个表,没有在时间戳更新时创建的_。然后使用sqlite3控制台将文件导入临时表,然后将信息从临时表导入目标表。
    
    require 'rubygems'
    require 'csv'
    require 'active_record'
    require 'sqlite3'
    
    ActiveRecord::Base.configurations = YAML::load(DATA)
    ActiveRecord::Base.establish_connection('development')
    
    class Record < ActiveRecord::Base
      self.table_name = "mytablename" # <=== REPLACE THIS with your table name
    end
    
    CSV.foreach ARGV[0], :headers => true do |row|
      print "."
      hash = Hash[row]
      hash.delete("updated_at")
      hash.delete("created_at")
      Record.create! hash
    end
    
    puts "\nDone."
    
    __END__
    development:
      adapter: sqlite3
      database: mydb.db  # <=== REPLACE THIS with a relative path to your sqlite3 DB
      pool: 5
      timeout: 5000