Mysql
 sql >> база данни >  >> RDS >> Mysql

Преброяване на броя на извършените заявки

Мисля, че сте отговорили на собствения си въпрос, като споменахте assert_queries , но ето:

Бих препоръчал да разгледате кода зад assert_queries и използвайки това, за да създадете свой собствен метод, който можете да използвате за преброяване на заявки. Основната магия тук е тази линия:

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

Имах малко бърникане тази сутрин и изтръгнах частите на ActiveRecord, които преброяват заявките, и стигнах до това:

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

Ще можете да направите справка с ActiveRecord::Base.count_queries метод навсякъде. Предайте му блок, в който се изпълняват вашите заявки и той ще върне броя на заявките, които са били изпълнени:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Връща "1" за мен. За да работи това:поставете го във файл на адрес lib/active_record/query_counter.rb и го изисквайте във вашия config/application.rb файл като този:

require 'active_record/query_counter'

Ей така!

Вероятно е необходимо малко обяснение. Когато извикаме тази линия:

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

Свързваме се с малката рамка за известия на Rails 3. Това е лъскаво малко допълнение към последната основна версия на Rails, за която никой не знае. Позволява ни да се абонираме за известия за събития в Rails, като използваме subscribe метод. Предаваме в случай, за който искаме да се абонираме като първи аргумент, след това всеки обект, който отговаря на call като втория.

В този случай, когато се изпълни заявка, нашият малък брояч на заявки ще увеличи прилежно променливата ActiveRecord::QueryCounter.query_count, но само за реалната запитвания.

Както и да е, това беше забавно. Надявам се да ви е полезно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CAST към DECIMAL в MySQL

  2. MySQL заявката не е вмъкната, когато PHP променливата съдържа единични кавички

  3. MYSQL Съкратена неправилна DOUBLE стойност

  4. MySQL получава само цялостен ROLLUP

  5. Какъв е правилният синтаксис за намиране и замяна на Regex с помощта на REGEXP_REPLACE в MariaDB?