簡體   English   中英

在Rails(PostgreSQL)中批量更新單個記錄

[英]Mass update individual records in Rails (PostgreSQL)

我偶然發現了更新一組記錄的問題。

在數據庫中,我有

id | name   | info::hstore | friends[]::varchar 
1  | Claire | {}           | []
2  | Mary   | {}           | []
3  | Bob    | {}           | []

我有一個哈希數組示例:

[ 
  {id: 1, name: "Claire", info: {age: 21, sex: 'f'}, friends: ['Mary', 'Bob']}, 
  {id: 2, name: "Mary", info: {age: 16, sex: 'f'}, friends: ['Mike']},
  {id: 3, name: "Bob", info: {age: 28, sex: 'm'}, friends: ['James']}
]

所有記錄都已經存在於數據庫中,我只想使用哈希表中的列來更新存在的表項,這些哈希表都具有相同數量的要更新的字段:名稱,信息和好友。

有一個gem active-record-import,但它只插入。 另外,方法#update_all無效,因為我有單獨的數據根據​​ID更新每個記錄。 不想進行原始SQL插入,因為我的行具有Postgres hstore和數組類型,也不想進行大量數據操作。

可能有大約10,000-100,000條記錄要更新。

Env:Postgres 9.4,Rails 3(如果在Rails4中有一個好的解決方案,不勝感激)

因此,我不確定您到目前為止是否反對這種方法,但是可以這樣做:

update_info = [{id: 1, name: "Claire", info: {age: 21, sex: 'f'}, friends: ['Mary', 'Bob']}, 
               {id: 2, name: "Mary", info: {age: 16, sex: 'f'}, friends: ['Mike']},
               {id: 3, name: "Bob", info: {age: 28, sex: 'm'}, friends: ['James']}
                   ]

update_info.each do |row|
  user = User.find(row[:id])
  user.update(info: row[:info], friends: row[:friends])
end

這是將您的信息從哈希數組中獲取到數據庫的唯一方法。 使用Postgres,您可以使用與聯接類似的方法從另一個表進行批量更新。 但是,如果您要解決所有這些麻煩,那么您應該僅在數據庫控制台psql或使用允許您執行SQL查詢的GUI DB程序中執行此操作。 在數據庫中,有些事情會做得更好,因為這是設計的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM