sql >> Databáze >  >> RDS >> Mysql

Počítání počtu provedených dotazů

Myslím, že jste na svou otázku odpověděli zmínkou assert_queries , ale tady je:

Doporučuji podívat se na kód za assert_queries a pomocí toho vytvořit svou vlastní metodu, kterou můžete použít k počítání dotazů. Hlavním kouzlem, které je zde obsaženo, je tento řádek:

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

Dnes ráno jsem si trochu popletl a vytrhl části ActiveRecord, které počítají dotazy, a přišel jsem na toto:

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

Budete moci odkazovat na ActiveRecord::Base.count_queries metoda kdekoli. Předejte mu blok, ve kterém se spouštějí vaše dotazy, a vrátí počet dotazů, které byly provedeny:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Vrací mi "1". Aby to fungovalo:vložte to do souboru na lib/active_record/query_counter.rb a vyžadovat jej ve vašem config/application.rb soubor takto:

require 'active_record/query_counter'

Ahoj!

Asi je potřeba trochu vysvětlení. Když zavoláme na tuto linku:

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

Zapojujeme se do malého rámce oznámení Rails 3. Je to malý lesklý doplněk k nejnovější hlavní verzi Rails, o kterém nikdo pořádně neví. Umožňuje nám přihlásit se k odběru upozornění na události v rámci Rails pomocí subscribe metoda. Předáme v případě, že se chceme přihlásit jako první argument, pak jakýkoli objekt, který odpovídá na call jako druhý.

V tomto případě, když je dotaz proveden, náš malý čítač dotazů poslušně zvýší proměnnou ActiveRecord::QueryCounter.query_count, ale pouze pro skutečné dotazy.

Každopádně to byla zábava. Doufám, že vám to bude užitečné.



  1. Chyba (kód chyby:1175) při provádění příkazu aktualizace na stole pomocí MySQL Workbench 5.2

  2. Serializovatelná úroveň izolace

  3. Zpracování chyb na úrovni absolventa

  4. Datový typ Postgres ENUM nebo CHECK CONSTRAINT?