2012-10-22 40 views
1

我的客戶給了我一個項目車輛列表。我需要將它們放入我可以使用的表格中,但它們目前位於.cvs文件中。我有readaroundfound一些信息,但沒有解決我的特殊問題。Rails和Postgres - 從.cvs複製到表,同時跳過created_at列

我已經生成了與.cvs文件(id,year,make,model,trim)中的信息匹配的模型,運行遷移,現在有我需要的表。當我嘗試使用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列暫時取消,然後將其添加到另一個遷移中?任何指導將不勝感激。

感謝

回答

1

created_at列當您運行遷移創建一個表爲一個新的模型自動導軌進行的大部分時間。當你在應用程序中創建一個新的模型對象時,它通常由Rails默認代碼填充大部分時間。

儘管您正在將數據直接加載到數據庫中,但繞過了所有的Rails代碼。這很好,但你也需要做Rails做的事情。

我認爲最簡單的辦法將是直接從數據庫中刪除的created_at等欄目,裝載您的CSV文件,然後在加列了。

+0

謝謝,我是傾斜這種方式。我知道鐵軌這樣做,我可以手動刪除列。我不認爲我需要刪除updated_at,因爲它可能是空的,對吧?什麼是刪除列的最佳方式?隨着遷移?不知道這裏的最佳做法... –

+0

如果此數據加載是一次性事情,您可能想要在SQL中完成所有操作。刪除列,加載您的數據,再次添加列。如果你認爲你需要偶爾做,可以考慮在Rails應用程序中添加一些代碼來爲你做。 – dpassage

+0

截至目前,它看起來像季度更新。我想我們認爲我們會有更好的解決方案,但是暫時我不介意每次重建表格。現在,如果我只知道最好的方法去做... –

0

你也可以擁有Postgres的標準輸入讀取,允許您在加載之前修改數據。

我用這樣的東西,這是未經測試的,但應該給你一個輪廓。

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