2009-10-19 3 views
1

천개의 키/값 쌍을 초과하는 해시가 있습니다.Rails에서 루핑을하지 않고 해시에서 많은 행을 업데이트합니다.

나는 수천 개의 행을 가진 데이터베이스 테이블을 가지고있다.

그래서 해를 바탕으로 테이블을 업데이트하는 것은 매우 간단합니다. 예 : :

my_hash.each{|key,value| 
    Model.update_all("column2 = #{value}", "column1 = #{key}") 
} 

그러나이 작업은 수천 개의 SQL 업데이트 문을 수행합니다.

하나 또는 몇 개의 업데이트 문으로이 작업을 수행하는 좋은 방법이 있습니까?

답변

2

음 Mike Woodhouse 및 ttarchala의 힌트로 해결했습니다. 여기에 코드의 내가 포스트 그레스를 사용하고

# connect to the database 
DB = Sequel.connect("postgres://user:[email protected]/blah") 

# create the temporary table 
DB.create_table :temp_update, :temp => true do 
    primary_key :key 
    String :value 
end 

# insert rows from the hash (multi_insert takes an array of hashes,hence the map) 
DB[:temp_update].multi_insert(my_hash.map{|k,v| {:key => k, :value => v}}) 

# Do the update based on a join 
DB.execute(" UPDATE my_table 
       SET column2 = temp_update.value 
       FROM temp_update 
       WHERE column1 = temp_update.id") 

(나는 Ruby Sequel gem을 사용하고 있습니다) 그래서 정확한 갱신 SQL은 다른 RDBMS에서는 다를 수 있습니다.

-1

예. 내가 특별히 레일에 대해 알고하지 않습니다,하지만 당신은 같은 작품은 IN SQL 키워드를 사용할 수 있습니다

select * from table where column in ('list', 'of', 'values') 
+0

업데이트가 아닙니다. – DanSingerman

+0

나는 그를 도와 줄 것입니다 : UPDATE table SET field = value, field2 = value2 어디에서 ID가 (3,8,33,756,6543,54637) – chrishomer

3

가장 빠른 방법 - 어떤 언어로,이 레일에서 어떻게하는지 모르는 특별히 - 데이터베이스의 임시 테이블에 메모리 해시를 덤프하고 해시의 키와 값에 대한 열만있는 다음 단일 테이블을 업데이트하고 테이블을 업데이트하여 새 임시 테이블로 연결하는 조인을 사용합니다.

쿼리 계획을 점검하여 옵티마이 저가 제대로 작동하는지 확인하고 업데이트를 실행하기 전에 임시 테이블에 임시 인덱스를 작성하십시오. 그렇지 않으면 직접 색인을 작성하십시오.

+0

+1이 될까요? 업데이트를 실행할 수있는 것보다 빠르게 해시 테이블을로드 할 수 있습니다. – cjk

+0

감사합니다. 나는이 방법을 알고 있지만 Rails에서 어떻게해야하는지 확신하지 못한다. ( – DanSingerman

2

"좋은"것이 확실하지 않지만, 많은 DBMS 플랫폼에서 한 번에 여러 SQL 문을 보낼 수 있습니다. 예를 들어, ar-extensions 보석은 플랫폼에 따라 약간의 조정이 필요할 수 있지만 INSERT 문을 배치하는 데 도움이 될 수 있습니다. 예를 들어 Oracle은 약간 까다 롭습니다. 나는 그것이 직접 UPDATE를 처리하지 않는다고 생각하지만, 여기에있는 다른 응답에서 temp 테이블 트릭을 사용하여 조사 할 수있다 : 데이터를 일괄 적으로로드하고 ActiveRecord.execute을 사용하여 UPDATE를 실행한다. find_by_sql 같은 일이 존재하는 이유는 아마 가능하지만, 다시, 레일 (또는 더 정확하게 액티브)는 ORM 기능이 절대적으로 모든에 사용하는 것을 목적으로 결코 의미에서

아마도 단지 "좋은", 그건 : 그들은 더 나은 방법을 알고있는 시대에 거기에 있습니다.

+0

ar 확장을 사용했다. 훌륭하게 작동한다. – semanticart

관련 문제