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 に答える