Ich möchte die SQL-Anweisung sehen, die eine bestimmte ActiveRecord-Abfrage generiert. Ich erkenne, dass ich diese Informationen aus dem Protokoll abrufen kann, nachdem die Abfrage ausgegeben wurde, aber ich frage mich, ob es eine Methode gibt, die aufgerufen werden kann, und ActiveRecord Query.
Beispielsweise:
SampleModel.find(:all, :select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")
Ich möchte die irb-Konsole öffnen und am Ende eine Methode anheften, die die SQL anzeigt, die diese Abfrage generiert, aber nicht unbedingt die Abfrage ausführt.
quelle
date
> # {self.date}"] ,: limit => 1 ,: order => 'date
' ,: group => "date
") .show_generated_sql und lassen Sie dies die Methode construct_finder_sql aufrufen.show_generated_sql
wird auf einen bereits abgerufenen Datensatz von reagierenfind
.construct_finder_sql
wird tatsächlich entferntÄhnlich wie bei Penger, funktioniert jedoch jederzeit in der Konsole, auch nachdem Klassen geladen und der Logger zwischengespeichert wurden:
Für Schienen 2:
Für Schienen 3.0.x:
Für Rails> = 3.1.0 erfolgt dies standardmäßig bereits in Konsolen. Falls es zu laut ist und Sie es ausschalten möchten, können Sie Folgendes tun:
quelle
rails console
. Funktioniert es nur für irb, die direkt von der Shell geladen werden? (oder wurde es für Schienen 3 entfernt?)environment.rb
..if "irb" == $0;ActiveRecord::Base.logger = Logger.new(STDOUT);end
..got dies aus Kommentaren in http://weblog.jamisbuck.org/2007/1/8/watching-activerecord-do verschieben -es-s-DingKleben Sie
puts query_object.class
irgendwo ein, um zu sehen, mit welcher Art von Objekt Sie arbeiten, und suchen Sie dann in den Dokumenten.In Rails 3.0 verwenden beispielsweise Bereiche
ActiveRecord::Relation
eine#to_sql
Methode. Beispielsweise:Dann können Sie irgendwo etwas tun:
quelle
includes
in Ihrer Beziehung habenDies mag eine alte Frage sein, aber ich benutze:
Die
explain
Methode gibt eine ziemlich detaillierte SQL-Anweisung darüber, was sie tun wirdquelle
Verwenden
to_sql
Sie einfach die Methode und es wird die SQL-Abfrage ausgegeben, die ausgeführt wird. Es funktioniert mit einer aktiven Datensatzbeziehung.In
find
diesem Fall funktioniert es nicht. Sie müssen diese ID also manuell zur Abfrage hinzufügen oder mit where ausführen.quelle
Dies ist, was ich normalerweise mache, um SQL in der Konsole zu generieren
Sie müssen dies tun, wenn Sie die Konsole zum ersten Mal starten. Wenn Sie dies tun, nachdem Sie Code eingegeben haben, scheint dies nicht zu funktionieren
Ich kann das nicht wirklich würdigen, habe es vor langer Zeit in einem Blog von jemandem gefunden und kann mich nicht erinnern, wer es ist.
quelle
Erstellen Sie eine .irbrc-Datei in Ihrem Home-Verzeichnis und fügen Sie diese ein in:
Dadurch werden SQL-Anweisungen in Ihre irb-Sitzung ausgegeben, während Sie fortfahren.
EDIT: Tut mir leid, dass die Abfrage immer noch ausgeführt wird, aber es ist am nächsten, von dem ich weiß.
BEARBEITEN: Jetzt können Sie mit arel Bereiche / Methoden erstellen, solange das Objekt ActiveRecord :: Relation zurückgibt und .to_sql darauf aufruft, und es wird die SQL ausgeben, die ausgeführt werden soll.
quelle
Meine typische Methode, um zu sehen, welche SQL verwendet wird, besteht darin, einen "Fehler" in die SQL einzuführen. Anschließend wird eine Fehlermeldung an den normalen Logger (und den Webbildschirm) gesendet, auf der sich die betreffende SQL befindet. Sie müssen nicht herausfinden, wohin stdout geht ...
quelle
Probieren Sie das show_sql-Plugin aus . Mit dem Plugin können Sie SQL drucken, ohne es auszuführen
quelle
Sie können die Protokollmethode der Verbindung ändern, um eine Ausnahme auszulösen und zu verhindern, dass die Abfrage ausgeführt wird.
Es ist ein totaler Hack, aber es scheint für mich zu funktionieren (Rails 2.2.2, MySQL):
quelle
In Rails 3 können Sie diese Zeile zur Datei config / environment / development.rb hinzufügen
Die Abfrage wird jedoch ausgeführt. Aber die Hälfte wurde beantwortet:
quelle