Ver Fonte

[ruby/sinatra-sequel] Use batch update for postgres (#9127)

Petrik de Heus há 1 ano atrás
pai
commit
25862b317e

+ 15 - 0
frameworks/Ruby/sinatra-sequel/boot.rb

@@ -62,6 +62,21 @@ DB = connect ENV.fetch('DBTYPE').to_sym
 # Define ORM models
 class World < Sequel::Model(:World)
   def_column_alias(:randomnumber, :randomNumber) if DB.database_type == :mysql
+
+  def self.batch_update(worlds)
+    if DB.database_type == :mysql
+      worlds.map(&:save_changes)
+    else
+      ids = []
+      sql = String.new("UPDATE world SET randomnumber = CASE id ")
+      worlds.each do |world|
+        sql << "when #{world.id} then #{world.randomnumber} "
+        ids << world.id
+      end
+      sql << "ELSE randomnumber END WHERE id IN ( #{ids.join(',')})"
+      DB.run(sql)
+    end
+  end
 end
 
 class Fortune < Sequel::Model(:Fortune)

+ 6 - 4
frameworks/Ruby/sinatra-sequel/hello_world.rb

@@ -78,16 +78,18 @@ class HelloWorld < Sinatra::Base
 
   # Test type 5: Database updates
   get '/updates' do
-    worlds =
-      DB.synchronize do
+    worlds = nil
+    DB.synchronize do
+      worlds =
         ALL_IDS.sample(bounded_queries).map do |id|
           world = World.with_pk(id)
           new_value = rand1
           new_value = rand1 while new_value == world.randomnumber
-          world.update(randomnumber: new_value)
+          world.randomnumber = new_value
           world
         end
-      end
+      World.batch_update(worlds)
+    end
 
     json worlds.map!(&:values)
   end