我有一个 CSV 文件,我正在尝试使用 .import 命令导入 Sqlite3。db 表有 updated_at 和 created_at 列,但我的 CSV 文件没有,所以当我运行导入时,我收到一条错误消息:“预期 18 列,仅找到 16”
导入此文件的最简单方法是什么?
我尝试将 created_at、updated_at 列添加到 CSV 文件,但出现错误。
几个论坛建议使用 FasterCSV,但我不清楚如何使用 gem 来专门解决这个问题。
我有一个 CSV 文件,我正在尝试使用 .import 命令导入 Sqlite3。db 表有 updated_at 和 created_at 列,但我的 CSV 文件没有,所以当我运行导入时,我收到一条错误消息:“预期 18 列,仅找到 16”
导入此文件的最简单方法是什么?
我尝试将 created_at、updated_at 列添加到 CSV 文件,但出现错误。
几个论坛建议使用 FasterCSV,但我不清楚如何使用 gem 来专门解决这个问题。
在这里,威廉,试试这个代码。将 CSV 导入数据库是 Ruby 代码,忽略 created_at 和 updated_at。
要运行它:
self.table_name = "mytablename"
您要导入的表的实际名称。在命令行上,键入:
gem install active_record sqlite3
ruby import.rb path/to/csvfile.csv
(如果您使用的是 Mac,请使用“sudo gem install”而不是“gem install”。)
好的,代码如下:
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
created_at
如果和的值updated_at
在 CSV 中添加如下,.import xyz.csv xyz
则应正确导入数据。
... | "2013-02-10 15:17:17" | "2013-02-10 15:17:17"
以这种方式导入时遇到什么错误?
当您使用库导入数据时,导入通过 ActiveRecord 接口进行,该接口自动添加created_at
和updated_at
字段,就像您从 GUI 添加记录时一样。
查看Ruby on Rails - Import Data from a CSV file的答案以获取代码示例。
有关使用该库的信息,请参阅Ruby 的 csv 标准库(以前是 FasterCSV)。