我有一個功能,我試圖將一個非常大的 CSV 檔案復制到我的資料庫中。我正在使用pggem 快速完成此操作,如本文POSTGRESQL COPY 中所述。
在我的 schema.rb 中,我對模型有獨特的約束,因此在上傳程序中有時會PG::UniqueViolation在嘗試匯入檔案時遇到約束錯誤。
我需要做的是我需要能夠捕獲此錯誤,并且一旦捕獲,撰寫一些代碼來記錄錯誤和訊息以及其他一些詳細資訊。我遇到的問題是我目前無法捕獲將資料寫入檔案的例外。下面是下面的偽代碼:
db_conn.copy_data(CODE_COPY_STATEMENT, enco) do
iterator.each do |line|
.......# CODE #.......
begin
db_conn.put_copy_data([information_to_copy])
rescue StandardError => e
I need to do some stuff here for processing the error, etc.
end
.......# CODE #......
end
end
到目前為止,我無法捕捉到錯誤,我試圖捕捉PG::UniqueValidation,StandardError等等,但沒有成功。最終,我需要做的是跳過這個錯誤并繼續處理檔案。有人有什么我可以嘗試的嗎?幫助將不勝感激。
uj5u.com熱心網友回復:
COPY是單個陳述句,只能以原子方式應用 - 即使您以塊的形式流式傳輸資料。當您捕獲例外時,該COPY陳述句已中止,在發生違規之前的行都不可查詢,并且COPY無法恢復。例如,如果您有 10 行,而單行導致違規,那么獲取其他 9 行的唯一方法是使用不包含有問題的行的 INSERT 或 COPY 。在實踐中,這意味著使用單行插入,可能帶有保存點,因此您不必執行每行事務。
您可能要考慮的另一種方法是復制到沒有約束的表中,使用常規 DML 將非違規行復制到實際資料中,然后洗掉/截斷您用于匯入的表。
但從根本上說,“可恢復的、容忍違規的COPY”根本不是一回事。該陳述句是PG中操作成功或失敗的最細粒度級別,COPY仍然只是一個陳述句。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/408608.html
標籤:
上一篇:API加載失敗
