Rails 콘솔에서 실행되는 SQL 쿼리를 표시하는 방법은 무엇입니까?


115

콘솔에서 쿼리 (예 : MyModel.where(...)또는 record.associated_things)를 실행할 때 어떤 일이 발생하는지 더 잘 이해할 수 있도록 실행중인 실제 데이터베이스 쿼리를 어떻게 볼 수 있습니까?


당신이 broweser에서 명령을 실행하는 것이 필요한 경우 앤드류, 당신은 사용할 수 있습니다 github.com/igorkasyanchuk/rails_db
이고르 Kasyanchuk

답변:


249

Rails 3+

콘솔에 다음 행을 입력하십시오.

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

레일스 2

콘솔에 다음 행을 입력하십시오.

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

완벽 해요, 제가 필요했던 것입니다. 이와 같은 작은 트릭을 어디로 가야할지 권장 사항이 문서화되어 있습니까?
randombits


2
이것은 레일 3+에서는 작동하지만 2에서는 작동하지 않습니다. 아직있는 경우 stackoverflow.com/a/1576221을 참조하십시오. :)
rogerdpack

다시 비활성화하려면 : ActiveRecord::Base.logger = nil
Hula_Zell

저는 여기에 너무 많이 왔는데, 크롬에 "rails"를 입력하면이 페이지가 최상위 결과로 표시됩니다
23tux

33

Rails 3+에서는 ActiveRecord :: Relation의 to_sql방법을 사용할 수 있습니다 .

User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\"  WHERE \"users\".\"id\" = 3"

25

.explainRails 4 에는 방법 이 있습니다 .
(도 .to_sql작동하지만 포함을 표시하지 않습니다)

Category.includes(:products).explain
=> EXPLAIN for: SELECT "categories".* FROM "categories" 0|0|0|SCAN TABLE categories

EXPLAIN for: SELECT "categories_products".* FROM "categories_products" WHERE "categories_products"."category_id" IN (1, 2) 0|0|0|SCAN TABLE categories_products

EXPLAIN for: SELECT "products".* FROM "products" WHERE "products"."id" IN (1, 2, 3, 4, 5, 6, 7) 0|0|0|SEARCH TABLE products USING INTEGER PRIMARY KEY (rowid=?) 0|0|0|EXECUTE LIST SUBQUERY 1

.explain유언장이 일을하는 데는 너무 많은 시간이 걸렸습니다 .to_sql. 그리고 .explain여전히 pg 콘솔에서 실행할 수있는 원시 형식의 SQL 쿼리를 제공하지 않습니다. 하지만 설명하고 분석하려면 원시 쿼리가 필요했습니다. 지금은 설명과 관련이있을 것 같습니다.
abhishek77in

4

최근부터 다음을 사용할 수 있습니다.

https://github.com/dejan/rails_panel

Chrome 용 개발자 콘솔 패널 추가 기능 과 다음과 같이 애플리케이션의 Gemfile에 추가해야하는 gem 파일로 구성됩니다 .

group :development do
  gem 'meta_request'
end

그런 다음 다시 실행하십시오.

bundle install

애플리케이션을 다시 시작하고 열고 개발자 콘솔을 시작하면 다음과 같이 표시됩니다. 여기에 이미지 설명 입력



0

로거 수준을 설정하는 것을 선호합니다 config/application.rb.

config.after_initialize do
  Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end

프로덕션 ENV['LOG_LEVEL']에서는 값이으로 설정되고 Logger::INFO로컬 컴퓨터에서는 Logger::DEBUG.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.