sql >> Base de Datos >  >> RDS >> Mysql

Contando el número de consultas realizadas

Creo que respondiste tu propia pregunta mencionando assert_queries , pero aquí va:

Recomendaría echar un vistazo al código detrás de assert_queries y usar eso para construir su propio método que puede usar para contar consultas. La principal magia involucrada aquí es esta línea:

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

Tuve un poco de retoques esta mañana y arranqué las partes de ActiveRecord que hacen el conteo de consultas y se me ocurrió esto:

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

Podrá hacer referencia al ActiveRecord::Base.count_queries método en cualquier lugar. Pásale un bloque en el que se ejecutan tus consultas y te devolverá el número de consultas que se han ejecutado:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Me devuelve "1". Para que esto funcione:ponlo en un archivo en lib/active_record/query_counter.rb y solicitarlo en su config/application.rb archivo como este:

require 'active_record/query_counter'

¡Oye, listo!

Probablemente se requiera un poco de explicación. Cuando llamamos a esta línea:

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

Nos conectamos al pequeño marco de notificaciones de Rails 3. Es una pequeña adición brillante a la última versión principal de Rails que nadie realmente conoce. Nos permite suscribirnos a notificaciones de eventos dentro de Rails usando el subscribe método. Pasamos el evento al que queremos suscribirnos como primer argumento y luego cualquier objeto que responda a call como el segundo.

En este caso, cuando se ejecuta una consulta, nuestro pequeño contador de consultas incrementará diligentemente la variable ActiveRecord::QueryCounter.query_count, pero solo para el real consultas.

De todos modos, esto fue divertido. Espero que te sea útil.