ActiveRecord - 更新大量資料
前言
本文使用的兩種方法,實際上都是用一個 sql 插入或更新所有的資料。
原因是使用其他的方法都沒有使用一個sql插入快。
如果插入的筆數過多,需要調整 sql buffer 的大小。
本例子的情景是一次更新100筆資料,資料量不大,所以不會遇到這個問題。
方法一:純 SQL
- 因為欄位很多,我要傳送的欄位又是完整的一個不少,所以我用
Model.attribute_names
來組合要傳入的欄位名稱。 - 然後將要更新的 Hash 組成
VALUES (x1, y1, z1, ...), (x2, y2, z2, ...), ...
字串 - 最後將要更新的欄位組成
flag_string=VALUES(flag_string)
這種格式
想要組出的 sql
1 |
|
組出來的結果
query string 這邊比較難處理,因為是 raw sql,如果在 integer 型態的欄位塞入 ''
,或是在字串的欄位沒有用引號括起來都會噴錯。這也是使用 raw sql 撰寫的缺點。
1 |
|
完整程式碼:
1 |
|
這樣組出的 SQL 結果如下
1 |
|
方法二:使用 AcitveRecord-import
AcitveRecord Import 是一個專門用來批次新增或是修改資料的 gem。
用法很簡單,在原本的 Model 後面加上要新的陣列,並指定要更新的欄位即可。
要更新的欄位也支援使用 sql 語句。
1 |
|
結論
組 Sql 不需要先把資料包成物件,效能會比較好。
不過相對來說需要多花一些時間處理資料欄位型態的問題,
而本例中的 mysql 因為是一個指令加上要更新的欄位可能很多,
所以 debug 的難度比較高。
這時候就看取捨了,如果初期趕著功能上線可以先用 activeRecord-import 來寫,
當遇到效能需要最佳化的時候再改成純 sql 會是比較好的處理方式。