我目前正試圖將40多個從sqlite3匯出的CSV匯入到oracle db中,但我在將一些CSV匯入到相應的表中時似乎遇到了問題。
代碼行是:
class_name.create! (row.to_hash)
在一些類上產生了錯誤,因為當回呼也被觸發了
.create!()方法被呼叫
def import_csv_into_db
Dir.foreach(Rails.root.join('db'/span>, 'csv_export') do |filename||
next if filename == '. ' or filename == '. or filename =='extract_db_into_csv.sh' or filename =='import_csv.rb' >。
filename_renamed = File.basename(filename, File.extname(filename)).chomp('s').titleize.gsub(/s /, "" )
CSV.foreach(Rails.root.join('db', 'csv_export',檔案名), headers: true) do |row||
class_name = Object.const_get(filename_renamed)
把class_name
class_name.create! (row.to_hash)
puts "在表#{class_name}s上插入完成。 #{row.to_hash}"
結束。
end
end end
目前的問題是,我的CSV匯入功能在seeds.rb中,所以當我運行bundle exec rake db:seed時,CSV被匯入。
當class_name.create!(row.to_hash)在seeds.rb的函式中被觸發時,我到底如何才能避免回呼被觸發呢?
在我的customer.rb中,我有這樣的回呼:
after_create :add_default_user或者after_create :add_build_config
我想在seeds.rb中操作我的函式,以便在函式嘗試匯入CSV檔案如customers.csv時跳過回呼(這在邏輯上會呼叫Customer.create!(row.to_hash))。
uj5u.com熱心網友回復:
有一些較低級別的方法將不運行回呼。例如,你可以呼叫insert!,而不是create! 你可以呼叫delete,而不是destroy。
附帶說明:使用insert_all!來一次性批量插入多行。你的匯入會快得多,而且它不使用驗證。盡管我建議使用更靈活的active-import,而不是
然而,如果回呼對于資料的完整性是必要的,跳過回呼可能會導致問題。如果你
delete而不是destroy,相關的資料可能不會被洗掉,或者你可能會因為參考性完整性而出現錯誤。請確保在你的外鍵上添加on delete操作以避免這種情況。然后,資料庫本身就會處理這個問題。 考慮您的外鍵是否會被洗掉?
請考慮您的 db:seeds 是否做得太多。如果匯入 CSV 妨礙了資料庫的播種,請考慮它是否應該成為一個單獨的rake 任務。
考慮是否可以將您的回呼重寫為idempotent,即能夠多次運行。例如,after_create :add_default_user應該認識到已經有一個默認用戶,而不是試圖重新添加它。
最后,考慮每次創建模型時運行的回呼是否是完成這項作業的正確位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/307014.html
標籤:
