จะแสดงการสืบค้น SQL ใน Rails console ได้อย่างไร?


116

เมื่อฉันเรียกใช้แบบสอบถาม (เช่นMyModel.where(...)หรือrecord.associated_things) ในคอนโซลฉันจะเห็นการสืบค้นฐานข้อมูลจริงได้อย่างไรเพื่อให้ฉันเข้าใจมากขึ้นว่าเกิดอะไรขึ้น


Andrew หากคุณต้องการเรียกใช้คำสั่งใน broweser คุณสามารถใช้github.com/igorkasyanchuk/rails_db
Igor Kasyanchuk

ดูคำตอบนี้ด้วย: stackoverflow.com/a/1576221/446106
mwfearnley

คำตอบ:


251

ราง 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

ฉันเคยมาที่นี่หลายครั้งเมื่อฉันพิมพ์ "ราง" ในโครเมี่ยมมันจะแสดงหน้านี้เป็นผลการค้นหาอันดับต้น ๆ
23

33

ใน Rails 3+ คุณสามารถใช้to_sqlเมธอดของ ActiveRecord :: Relation :

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

25

มี.explainวิธีการใน Rails 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ยังไม่มีแบบสอบถาม sql ในรูปแบบดิบซึ่งฉันสามารถเรียกใช้ใน pg console แต่ฉันต้องการแบบสอบถามดิบเพื่ออธิบายและวิเคราะห์ ฉันเดาว่าจะต้องอธิบายในตอนนี้
abhishek77 ใน

4

เมื่อเร็ว ๆ นี้คุณสามารถใช้สิ่งนี้:

https://github.com/dejan/rails_panel

ประกอบด้วยส่วนเสริมแผงคอนโซลสำหรับนักพัฒนาซอฟต์แวร์สำหรับ chrome และไฟล์ gem ที่ต้องเพิ่มลงในGemfileของแอปพลิเคชันของคุณดังนี้:

group :development do
  gem 'meta_request'
end

จากนั้นเรียกใช้อีกครั้ง:

bundle install

รีสตาร์ทแอปพลิเคชันของคุณเปิดและเปิดคอนโซลนักพัฒนาและคุณจะเห็นสิ่งนี้: ใส่คำอธิบายภาพที่นี่


3

เริ่มต้นจาก Rails 6 มีวิธีที่สะดวกกว่า: เพียงเพิ่มActiveRecord::Base.verbose_query_logs = trueในคอนโซลแล้วคุณจะเห็นการเรียก SQL ทั้งหมดและตำแหน่งที่ถูกเรียก ข้อมูลเพิ่มเติมhttps://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs


0

ฉันต้องการตั้งค่าระดับคนตัดไม้ในconfig/application.rb:

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

ในการผลิตของฉันENV['LOG_LEVEL']จะถูกตั้งค่าของและเครื่องท้องถิ่นของฉันมันจะเป็นLogger::INFOLogger::DEBUG

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.