sql >> Database >  >> RDS >> Mysql

Het aantal uitgevoerde zoekopdrachten tellen

Ik denk dat je je eigen vraag hebt beantwoord door assert_queries . te noemen , maar hier komt:

Ik zou aanraden om de code achter assert_queries te bekijken en dat te gebruiken om uw eigen methode te bouwen die u kunt gebruiken om query's te tellen. De belangrijkste magie die hierbij betrokken is, is deze regel:

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

Ik was vanmorgen een beetje aan het sleutelen en scheurde de delen van ActiveRecord eruit die de query's tellen en kwam met dit op de proppen:

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

U kunt verwijzen naar de ActiveRecord::Base.count_queries methode overal. Geef het een blok door waarin uw zoekopdrachten worden uitgevoerd en het zal het aantal uitgevoerde zoekopdrachten retourneren:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Retourneert "1" voor mij. Om dit te laten werken:plaats het in een bestand op lib/active_record/query_counter.rb en vereist het in uw config/application.rb bestand als volgt:

require 'active_record/query_counter'

Hallo!

Een klein beetje uitleg is waarschijnlijk vereist. Als we deze regel noemen:

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

We haken in op het kleine notificatiekader van Rails 3. Het is een glimmende kleine toevoeging aan de nieuwste grote versie van Rails waar niemand echt iets vanaf weet. Hiermee kunnen we ons abonneren op meldingen van evenementen binnen Rails met behulp van de subscribe methode. We geven door in het geval dat we ons willen abonneren als het eerste argument en vervolgens elk object dat reageert op call als de tweede.

In dit geval, wanneer een query wordt uitgevoerd, zal onze kleine queryteller plichtsgetrouw de ActiveRecord::QueryCounter.query_count variabele verhogen, maar alleen voor de echte vragen.

Dit was in ieder geval leuk. Ik hoop dat het nuttig voor je is.



  1. Groottelimiet van JSON-gegevenstype in PostgreSQL

  2. PHP password_verify werkt niet tegen database

  3. geldbedragen opslaan in mysql

  4. Android Room - Hoe de automatisch gegenereerde primaire sleutel van de tabel opnieuw in te stellen bij elke app-run