[sql] Ruby on Rails에서 주어진 ActiveRecord 쿼리에 의해 생성 될 SQL을 어떻게 볼 수 있습니까?

주어진 ActiveRecord 쿼리가 생성 할 SQL 문을보고 싶습니다. 쿼리가 실행 된 후 로그에서이 정보를 얻을 수 있다는 것을 알고 있지만 호출 할 수있는 메서드와 ActiveRecord 쿼리가 있는지 궁금합니다.

예를 들면 :

SampleModel.find(:all, :select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")

irb 콘솔을 열고이 쿼리가 생성 할 SQL을 보여 주지만 반드시 쿼리를 실행하지는 않는 메서드를 끝에 추가하고 싶습니다.



답변

마지막으로 시도했을 때 공식적인 방법이 없었습니다. 나는 find그들과 그 친구들이 쿼리를 직접 생성하는 데 사용하는 함수를 사용했습니다. 프라이빗 API이므로 Rails 3가 완전히 망가뜨릴 위험이 크지 만 디버깅을 위해서는 괜찮은 솔루션입니다.

방법은 construct_finder_sql(options)( lib/active_record/base.rb:1681) send개인용이므로 사용해야 합니다.

편집 : construct_finder_sql Rails 5.1.0.beta1에서 제거되었습니다 .


답변

penger와 유사하지만 클래스가로드되고 로거가 캐시 된 후에도 콘솔에서 언제든지 작동합니다.

Rails 2 :

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)

Rails 3.0.x의 경우 :

ActiveRecord::Base.logger = Logger.new(STDOUT)

Rails> = 3.1.0의 경우 이것은 이미 콘솔에서 기본적으로 수행됩니다. 너무 시끄럽고 려면 다음을 수행하십시오.

ActiveRecord::Base.logger = nil


답변

막대기 puts query_object.class와 작업은 다음 문서를 조회 개체의 유형을 볼 수 어딘가에.

예를 들어 Rails 3.0에서 스코프 ActiveRecord::Relation#to_sql메소드 가있는 것을 사용합니다. 예를 들면 :

class Contact < ActiveRecord::Base
  scope :frequently_contacted, where('messages_count > 10000')
end

그런 다음 할 수있는 곳 :

puts Contact.frequently_contacted.to_sql


답변

이것은 오래된 질문 일 수 있지만 다음을 사용합니다.

SampleModel.find(:all,
                 :select => "DISTINCT(*)",
                 :conditions => ["`date` > #{self.date}"],
                 :limit=> 1,
                 :order => '`date`',
                 :group => "`date`"
                 ).explain

그만큼 explain 메서드는 수행 할 작업에 대한 자세한 SQL 문을 제공합니다.


답변

to_sql메서드를 사용 하면 실행할 SQL 쿼리가 출력됩니다. 활성 레코드 관계에서 작동합니다.

irb(main):033:0> User.limit(10).where(:username => 'banana').to_sql
=> "SELECT  "users".* FROM "users"  WHERE "users"."username" = 'banana'
LIMIT 10"

을 할 때 find작동하지 않으므로 해당 ID를 쿼리에 수동으로 추가하거나 where를 사용하여 실행해야합니다.

irb(main):037:0* User.where(id: 1).to_sql
=> "SELECT "users".* FROM "users"  WHERE "users"."id" = 1"


답변

이것은 콘솔에서 SQL을 생성하기 위해 일반적으로 수행하는 작업입니다.

-> script/console
Loading development environment (Rails 2.1.2)
>> ActiveRecord::Base.logger = Logger.new STDOUT
>> Event.first

콘솔을 처음 시작할 때이 작업을 수행해야합니다. 코드를 입력 한 후이 작업을 수행하면 작동하지 않는 것 같습니다.

이것에 대해 정말로 신용을 얻지 못합니다. 오래 전에 누군가의 블로그에서 발견했으며 그것이 누구인지 기억할 수 없습니다.


답변

홈 디렉토리에 .irbrc 파일을 만들고 다음 위치에 붙여 넣습니다.

if ENV.include?('RAILS_ENV') && !Object.const_defined?('RAILS_DEFAULT_LOGGER')
  require 'logger'
  RAILS_DEFAULT_LOGGER = Logger.new(STDOUT)
end

그러면 SQL 문이 irb 세션에 출력됩니다.

편집 : 미안하지만 여전히 쿼리를 실행하지만 내가 아는 가장 가깝습니다.

편집 : 이제 arel을 사용하여 개체가 ActiveRecord :: Relation을 반환하고 .to_sql을 호출하는 한 범위 / 메서드를 빌드 할 수 있으며 실행될 SQL을 출력합니다.