如何为env正在生产的每个用户获取SQL查询

时间:2009-11-09 14:20:52

标签: sql ruby-on-rails

我正在开发一个专门用于生成统计报告的应用程序,我希望该用户在保存他们的stat报告后也能保存sql查询。为此,我写了以下模块:

module SqlHunter

    class ActiveRecord::ConnectionAdapters::AbstractAdapter

        @@queries = [] 
        cattr_accessor :queries 
        def log_info_with_trace(sql, name, runtime)
            return unless @logger && @logger.debug?
            @@queries << sql 
        end
        alias_method_chain :log_info, :trace
    end
end

在我写的控制器中

sqlfile = File.open("public/advancedStats/#{@dir_name}/advancedStatQuery.sql", 'w')
@queries = ActiveRecord::ConnectionAdapters::AbstractAdapter::queries
for query in @queries do
    sqlfile.write("#{query} \n")
end
sqlfile.close

我还通过添加以下行修改了Rails环境:

ActiveRecord::Base.logger.level = Logger::DEBUG

这个程序正在运行,我可以获得所有查询但是,我只需要一个用户完成的特定查询来生成统计报告。

有人有任何想法, 谢谢,

mgatri

1 个答案:

答案 0 :(得分:1)

您可以添加一个访问者,说明您是否要记录。

@@queries = []
@@loging = false
cattr_accessor :queries, :logging

def log_info_with_trace(sql, name, runtime)
    return unless @logger && @logger.debug?
    @@queries << sql if @@logging 
end

执行ActiveRecord::ConnectionAdapters::AbstractAdapter::logging = true时 然后,将记录您的SQL查询。当你将它设置为false时,它们不会。

所以你只能随时记录它们。

要清除旧查询,只需清除阵列即可。

ActiveRecord::ConnectionAdapters::AbstractAdapter::queries.clear