Mysql
 sql >> Database >  >> RDS >> Mysql

Conteggio del numero di query eseguite

Penso che tu abbia risposto alla tua stessa domanda citando assert_queries , ma ecco qui:

Consiglierei di dare un'occhiata al codice dietro assert_queries e usandolo per costruire il tuo metodo che puoi usare per contare le query. La magia principale coinvolta qui è questa linea:

ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)

Stamattina ho armeggiato un po' e ho strappato le parti di ActiveRecord che eseguono il conteggio delle query e ho trovato questo:

module ActiveRecord
  class QueryCounter
    cattr_accessor :query_count do
      0
    end

    IGNORED_SQL = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/]

    def call(name, start, finish, message_id, values)
      # FIXME: this seems bad. we should probably have a better way to indicate
      # the query was cached
      unless 'CACHE' == values[:name]
        self.class.query_count += 1 unless IGNORED_SQL.any? { |r| values[:sql] =~ r }
      end
    end
  end
end

ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)

module ActiveRecord
  class Base
    def self.count_queries(&block)
      ActiveRecord::QueryCounter.query_count = 0
      yield
      ActiveRecord::QueryCounter.query_count
    end
  end
end

Potrai fare riferimento a ActiveRecord::Base.count_queries metodo ovunque. Passagli un blocco in cui vengono eseguite le tue query e restituirà il numero di query che sono state eseguite:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Restituisce "1" per me. Per farlo funzionare:inseriscilo in un file in lib/active_record/query_counter.rb e richiedilo nel tuo config/application.rb file come questo:

require 'active_record/query_counter'

A presto!

Probabilmente è necessaria una piccola spiegazione. Quando chiamiamo questa linea:

    ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)

Ci colleghiamo al piccolo framework delle notifiche di Rails 3. È una piccola e brillante aggiunta all'ultima versione principale di Rails di cui nessuno sa davvero. Ci consente di iscriverci alle notifiche di eventi all'interno di Rails utilizzando il subscribe metodo. Passiamo l'evento a cui vogliamo iscriverci come primo argomento, quindi qualsiasi oggetto che risponde a call come il secondo.

In questo caso, quando viene eseguita una query, il nostro piccolo contatore di query incrementerà diligentemente la variabile ActiveRecord::QueryCounter.query_count, ma solo per il reale domande.

Comunque, questo è stato divertente. Spero che ti sia utile.