2013-02-10 80 views
0

我有一个CSV文件,我试图使用.import命令导入到Sqlite3中。 db表有updated_at和created_at列,但我的CSV文件没有,所以当我运行导入时,我收到一条错误消息:“预计18列,只能找到16”将CSV文件导入到Sqlite3中 - 处理created_at,updated_at列的最简单方法是什么?

什么是最简单的导入方式文件?

我尝试添加created_at,updated_at列到CSV文件,但出现错误。

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

+0

我通过重新创建表解决了这个问题,而不created_at起来dated_at时间戳。然后使用sqlite3控制台将文件导入临时表,然后将临时表中的信息导入目标表。 – 2013-02-13 01:54:49

回答

2

在这里,威廉,给这个代码一试。这是Ruby代码将CSV导入数据库,忽略created_at和updated_at。

运行它

  1. 将代码粘贴到一个新的文件。我们称之为import.rb
  2. 编辑文件。将self.table_name = "mytablename"中的单词“mytablename”更改为要导入的表的实际名称。
  3. 接近文件末尾,将mydb.db替换为Sqlite3文件的实际名称。它应该是文件的相对路径(相对于import.rb)。
  4. 在命令行中键入:

    gem install active_record sqlite3 
    ruby import.rb path/to/csvfile.csv 
    

(如果你是在Mac上,使用“sudo的创业板安装,而不是仅仅 “创业板安装”)

好,下面的代码:


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 
0

如果在CSV中添加如下值created_atupdated_at.import xyz.csv xyz应正确导入数据。

... | "2013-02-10 15:17:17" | "2013-02-10 15:17:17" 

您以这种方式导入时会出现什么错误?

当您使用库导入数据时,通过ActiveRecord接口进行导入,该接口自动添加created_atupdated_at字段,就像从GUI添加记录时一样。

查看代码示例的Ruby on Rails - Import Data from a CSV file的答案。请参阅Ruby's csv standard library (which used to be FasterCSV previously)了解使用该库的信息。

相关问题