আমি কীভাবে এসকিউএল দেখতে পারি যা রেল অন রুবেলে প্রদত্ত অ্যাক্টিভেকর্ড কোয়েরি দ্বারা উত্পন্ন হবে


116

আমি একটি এসকিউএল বিবৃতি দেখতে চাই যা প্রদত্ত অ্যাক্টিভেকর্ড ক্যোয়ারী উত্পন্ন করবে। আমি সনাক্ত করেছি যে কোয়েরি জারি হওয়ার পরে আমি লগ থেকে এই তথ্যটি পেতে পারি, তবে আমি ভাবছি যে এমন কোনও পদ্ধতি আছে যা চালু করা যেতে পারে এবং অ্যাক্টিভেকর্ড কোয়েরি রয়েছে।

উদাহরণ স্বরূপ:

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

আমি আইআরবি কনসোলটি খুলতে চাই এবং শেষে এমন একটি পদ্ধতিটি টেক করতে চাই যা এসকিউএল দেখায় যে এই কোয়েরিটি উত্পন্ন করবে, তবে প্রয়োজনীয়ভাবে ক্যোয়ারিটি কার্যকর করবে না।

উত্তর:


12

শেষবার যখন আমি এটি করার চেষ্টা করেছি তখন এটি করার কোনও সরকারী উপায় ছিল না। আমি যে ক্রিয়াকলাপটি findএবং এর বন্ধুরা সরাসরি তাদের ক্যোয়ারী উত্পন্ন করতে ব্যবহার করে তা ব্যবহার করে অবতরণ করেছি । এটি প্রাইভেট এপিআই তাই রেলস 3 এটি সম্পূর্ণরূপে ভেঙে ফেলবে এমন একটি বিশাল ঝুঁকি রয়েছে তবে ডিবাগিংয়ের জন্য এটি একটি ঠিক সমাধান।

পদ্ধতিটি হ'ল construct_finder_sql(options)( lib/active_record/base.rb:1681) আপনাকে sendএটি ব্যবহার করতে হবে কারণ এটি ব্যক্তিগত।

সম্পাদনা : construct_finder_sql 5.1.0.beta1 কারাগারে সরানো হয়েছে


1
এটি আমি যা ভাবছি তার কাছাকাছি। আমার ধারণা, কোনও ব্যক্তি এমন একটি প্লাগইন লিখতে পারেন যা এরকম কিছু করতে পারে: স্যাম্পলমোডেল.ফাইন্ড (: সমস্ত,: নির্বাচন করুন>> "DISTINCT (*)",: শর্তাবলী => [" date> # {স্ব.ডেট}"]:: সীমা => ১,: অর্ডার => ' date',: গোষ্ঠী => " date") sh
RSSWolff

1
ডেটা ম্যাপার দিয়ে আপনি এটি করতে পারেন কারণ এটি এখনই ক্যোয়ারি চালায় না। অন্যদিকে অ্যাক্টিভেকর্ড তত্ক্ষণাত্ কোয়েরিটি কার্যকর করে। show_generated_sqlএর থেকে ইতিমধ্যে পুনরুদ্ধার করা ডেটাসেটে অভিনয় করবে find
জন এফ মিলার

4
construct_finder_sql
কারাগারে

190

পেঙ্গারের মতো, তবে ক্লাসগুলি লোড হওয়ার পরে এবং লগার ক্যাশে যাওয়ার পরেও কনসোলে যে কোনও সময় কাজ করে:

রেল 2:

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

Ails.০.x কারাগারগুলির জন্য:

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

রেলগুলি> = 3.1.0 এর জন্য এটি কনসোলে ডিফল্টরূপে ইতিমধ্যে সম্পন্ন হয়েছে। যদি এটি খুব গোলমাল হয় এবং আপনি এটি বন্ধ করতে চান আপনি এটি করতে পারেন:

ActiveRecord::Base.logger = nil

এটি আমার পক্ষে কাজ করছে না rails console। এটি কি কেবল শেল থেকে লোড করা আইআরবির জন্য কাজ করে? (বা এটি 3 রেলের জন্য সরানো হয়েছে?)
এরিক হু

2
তারা এটিকে রেল 3 এর জন্য আরও সংবেদনশীল জায়গায় নিয়ে গেছে ... আমার আপডেট হওয়া সংস্করণ দেখুন।
জিটিডি

আমি যখন কনসোলটি শুরু করি তখন স্বয়ংক্রিয়ভাবে এটি করার কোনও উপায় আছে? লোড হুকের মতো কিছু?
ধারা

1
@ স্ট্রিম 7..আপনি এখনই এটির দরকার হয় তা আমি জানি না, তবে আপনি এই কোডটি সরাতে পারেন environment.rb.. .. http://weblog.jamisbuck.org/2007/1/8/watching-activerecord-do- ​​এif "irb" == $0;ActiveRecord::Base.logger = Logger.new(STDOUT);end মন্তব্যগুলি থেকে এটি জানতে পারি -it-s-
point

এটি প্রশ্নের উত্তর দেয় না: কোয়েরি না চালিয়ে ডিবাগ করার সময় কোনও নির্দিষ্ট ক্যোয়ারির জন্য এসকিএল কীভাবে দেখানো যায়।
bradw2k

87

puts query_object.classআপনার কোন ধরণের অবজেক্টের সাথে কাজ করছেন তা দেখার জন্য কোথাও বেঁধে থাকুন , তারপরে দস্তাবেজগুলি অনুসন্ধান করুন।

উদাহরণস্বরূপ, রেল 3.0.০ এ স্কোপগুলি ব্যবহার করে ActiveRecord::Relationযার একটি #to_sqlপদ্ধতি রয়েছে। উদাহরণ স্বরূপ:

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

তারপরে, কোথাও আপনি করতে পারেন:

puts Contact.frequently_contacted.to_sql

3
কেন এই উত্তর upvated হয় না? রেল 3 এর পক্ষে এটি একটি উত্তম উত্তর - আপনি কেবল ".to_sql" রেখে কোনও এআর :: রিলেশন সম্পর্কিত বিবৃতিটির ফলাফল পেতে পারেন। এই প্রশ্নটি উত্তরটিও সরবরাহ করে
স্টিভ মিডলেগি

5
সাবধান: includesআপনার সম্পর্কের সাথে যদি আপনি থাকেন তবে আপনি সমস্ত এসকিউএল পাবেন না
ব্যারি কেলি

3
@ ব্যারিকিলি কেন?
বিষ্ণু নারানগ

25

এটি একটি পুরানো প্রশ্ন হতে পারে তবে আমি ব্যবহার করি:

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

explainপদ্ধতি তার কাজ করতে যাচ্ছেন কি বেশ একটি বিস্তারিত SQL বক্তব্য দেবেন


3
এটি ক্যোয়ারীও চালাবে, যা কেবলমাত্র রেকর্ডের জন্য লোকেরা যা চায় তা নাও হতে পারে।
ইব্রাহিম

22

কেবল to_sqlপদ্ধতিটি ব্যবহার করুন এবং এটি চালিত স্কয়ার কোয়েরি আউটপুট দেবে। এটি একটি সক্রিয় রেকর্ড সম্পর্কের উপর কাজ করে।

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

করার সময় findএটি কাজ করবে না, সুতরাং আপনাকে সেই আইডিটি ম্যানুয়ালি কোয়েরিতে যুক্ত করতে হবে বা এটি ব্যবহার করে চালাতে হবে।

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

11

কনসোলটিতে এসকিউএল উত্পন্ন করার জন্য আমি সাধারণত এটি করি

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

আপনি যখন কনসোলটি শুরু করবেন তখন আপনাকে এটি করতে হবে, আপনি কিছু কোড টাইপ করার পরে যদি এটি করেন তবে মনে হয় এটি কাজ করে না

এটির জন্য সত্যই কৃতিত্ব নিতে পারি না, এটি কারও ব্লগ থেকে অনেক আগে পাওয়া গিয়েছিল এবং এটি কার তা মনে করতে পারে না।


1
আমি বেশ নিশ্চিত যে এটি জামিস
আরএসওলফ

1
আমি নিশ্চিত নই যে এটি রেল ২.৩ বা আমার পরিবেশের কোনও কারণে রয়েছে, তবে এটি আমার পক্ষে কার্যকর হয় না। নীচে আমার প্রতিক্রিয়া দেখুন।
gtd

এটি একটি দুর্দান্ত সমাধান আইএমও।
বেনিয়ামিন আতকিন

10

আপনার হোম ডিরেক্টরিতে একটি .irbrc ফাইল তৈরি করুন এবং এতে আটকান:

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

এটি যেতে যেতে আপনার আইআরবি সেশনে এসকিউএল স্টেটমেন্টগুলি আউটপুট দেবে।

সম্পাদনা: দুঃখিত যে क्वेরিটি এখনও কার্যকর করা হবে, তবে এটি আমার নিকটতম জানা।

সম্পাদনা: এখন আরএল দিয়ে আপনি যতক্ষণ অবধি অ্যাক্টিভেকর্ড :: রিলেশন রিলেশন করতে এবং এটিতে .to_sql কল করতে পারেন ততক্ষণ আপনি স্কোপগুলি / পদ্ধতিগুলি তৈরি করতে পারবেন এবং এটি কার্যকর করা হতে চলেছে এমন এসকিএল স্থাপন করবে।


এটি আমি যা করেছিলাম তা তবে আমি কেবলমাত্র অনুমানিত এসকিউএলটি অ্যাক্টিভেকর্ড কোয়েরিটি উত্পন্ন করবে তা দেখার আগ্রহী। আমি অবাক হয়েছি এটি করার সহজ কোনও উপায় নেই ...
আরএসআলফ

5

এসকিএল এটি কীভাবে ব্যবহার করে তা দেখার আমার সাধারণ উপায়টি হল স্কুএলে একটি "বাগ" প্রবর্তন করা, তারপরে আপনি সাধারণ লগার (এবং ওয়েব স্ক্রিন) এর মধ্যে প্রশ্নযুক্ত সিকিএল থাকা একটি ত্রুটি বার্তা পাবেন। স্টাডাউট কোথায় যাচ্ছে তা খুঁজে পাওয়ার দরকার নেই ...


1
দর্শনীয় কিন্তু দ্রুত সমাধান :)
জান জানানোক

2

ব্যবহার করে দেখুন show_sql প্লাগইন । প্লাগইন আপনাকে এসকিউএল চালনা না করে মুদ্রণ করতে সক্ষম করে

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

1
দেখে মনে হচ্ছে লিঙ্কটি ভেঙে গেছে (404 ত্রুটি)। সম্ভবত, রায়ান বিগ প্লাগইনটি মোছা হয়েছে।
DNNX

1

আপনি কোনও ব্যতিক্রম বাড়াতে সংযোগের লগ পদ্ধতি পরিবর্তন করতে পারেন, ক্যোরি চালানো থেকে আটকাতে।

এটি মোট হ্যাক, তবে এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে (রেয়েলস ২.২.২, মাইএসকিউএল):

module ActiveRecord
  module ConnectionAdapters
    class AbstractAdapter
      def log_with_raise(sql, name, &block)
        puts sql
        raise 'aborting select' if caller.any? { |l| l =~ /`select'/ }
        log_without_raise(sql, name, &block)
      end
      alias_method_chain :log, :raise
    end
  end
end

0

রেল 3 এ আপনি এই লাইনটি কনফিগারেশন / পরিবেশ / উন্নয়ন.rb এ যুক্ত করতে পারেন

config.active_record.logger = Logger.new(STDOUT)

এটি কোয়েরিটি কার্যকর করবে। অর্ধেক উত্তর পেয়েছে:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.