4

我的客户给了我一个项目的车辆清单。我需要将它们放入我可以使用的表中,但它们当前位于 .cvs 文件中。我已经阅读找到一些信息,但没有解决我的特定问题。

我已经生成了一个与 .cvs 文件(id、年份、品牌、型号、修剪)中的信息匹配的模型,运行迁移,现在有了我需要的表。当我尝试使用 psql COPY 时出现问题。这是我读过的内容:

copy list_vehicles from '/path/to/list.csv' DELIMITERS ',' CSV;

但它给了我

ERROR:  missing data for column "created_at"

好吧,所以我试试这个:

copy list_vehicles (id, year, make, model, trim)  from '/path/to/list.csv' DELIMITERS ',' CSV;

我回来了

ERROR:  null value in column "created_at" violates not-null constraint

好的,那么这应该可以工作:

copy list_vehicles (id, year, make, model, trim)  from '/path/to/list.csv' DELIMITERS ',' WITH NULL AS ' ' CSV FORCE NOT NULL created_at;

不,

ERROR:  FORCE NOT NULL column "created_at" not referenced by COPY

我不知道从这里去哪里。我正在考虑暂时取消 created_at 列,然后将其添加到另一个迁移中?任何指导将不胜感激。

谢谢

4

2 回答 2

3

created_at大多数情况下,当您运行迁移为新模型创建表时,Rails 会自动生成该列。当您在应用程序中创建新模型对象时,它通常由 Rails 默认代码填充。

但是,您将数据直接加载到数据库中,绕过了所有 Rails 代码。这很好,但您还需要做 Rails 所做的事情。

我认为最简单的方法是created_at直接从数据库中删除和其他列,加载您的 CSV 文件,然后重新添加这些列。

于 2012-10-23T00:06:06.820 回答
0

您还可以让 Postgres 从 STDIN 读取数据,允许您在加载数据之前对其进行修改。

我使用这样的东西,它未经测试,但应该给你一个大纲。

connection = ActiveRecord::Base.connection.raw_connection

connection.exec("COPY #{tablename} (#{fields},created_at,updated_at) FROM STDIN")

data = File.open(datafile)
data::gets # abandon the header line (if needed)
data.each_with_index do |line, index|
  connection.put_copy_data(line + ",,")
end

connection.put_copy_end

res = connection.get_result
if res.result_error_message
  puts "Result of COPY is: %s" % [ res.result_error_message ]
end
于 2012-10-23T05:39:26.220 回答