{"id":419,"date":"2015-05-18T13:56:29","date_gmt":"2015-05-18T11:56:29","guid":{"rendered":"http:\/\/blog.kivitendo-premium.de\/?p=419"},"modified":"2016-04-12T14:42:30","modified_gmt":"2016-04-12T12:42:30","slug":"rose-debugging-in-der-console","status":"publish","type":"post","link":"https:\/\/blog.kivitendo.de\/?p=419","title":{"rendered":"Rose Debugging in der console"},"content":{"rendered":"<p>So schick die Datenbankabfragen per Rose sind, will man doch ab und an schauen, was da im Hintergrund auf Datenbankebene passiert, also welche SQL-Queries eigentlich generiert werden.<\/p>\n<p>W\u00e4hrend man beim alten Code in der kivitendo.conf unter [debug] per<br \/>\n<code>global_level = QUERY<\/code><br \/>\nnoch alle SQL-Abfragen in der Logdatei protokollieren konnte, mu\u00df man bei Rose nun<br \/>\n<code>dbix_log4perl = 1<\/code><br \/>\neinstellen, um die von Rose generierten Queries zu sehen. Das produziert dort auch immer unheimlich viel Ouput.<\/p>\n<p>In der Console kann man bei Manager-Methoden einen debug-Parameter \u00fcbergeben, wo das generierte SQL ebenfalls angezeigt wird:<br \/>\n<code>my $invoices = SL::DB::Manager::Invoice-&gt;get_all( where =&gt; [ id =&gt; 962 ], debug =&gt; 1);<br \/>\nSELECT<br \/>\nt1.amount,<br \/>\nt1.cp_id,<br \/>\nt1.currency_id,<br \/>\n&lt; ... snip ... &gt;<br \/>\nt1.type<br \/>\nFROM<br \/>\nar t1<br \/>\nWHERE<br \/>\nt1.id = ? (962)<br \/>\n<\/code><\/p>\n<p>Man kann aber auch das Logging explizit f\u00fcr alle Anfragen in der console Session (oder sogar beim Entwickeln von Test-Skripts) anstellen:<\/p>\n<p><code>$Rose::DB::Object::Manager::Debug = 1;<br \/>\n$Rose::DB::Object::Debug = 1; <\/code><\/p>\n<p>Ab dann sieht man direkt in der console, welche SQL-Abfragen im Hintergrund passieren, z.B. bei der Benutzung eines Filters:<br \/>\n<code>SL::DB::Manager::Invoice-&gt;get_all(where =&gt; [ SL::DB::Manager::Invoice-&gt;type_filter('invoice') ]);<\/code><\/p>\n<p>SELECT<br \/>\nt1.amount,<br \/>\nt1.cp_id,<br \/>\nt1.currency_id,<br \/>\n&lt; &#8230; snip &#8230; &gt;<br \/>\nt1.type<br \/>\nFROM<br \/>\nar t1<br \/>\nWHERE<br \/>\n(<br \/>\n(<br \/>\nt1.storno = ? OR<br \/>\nt1.storno IS NULL<br \/>\n) AND<br \/>\nt1.amount &gt;= ? AND<br \/>\nt1.invoice = ?<br \/>\n) (0, 0, 1)<\/p>\n<p>Ein paar Beispiele zum selber Ausprobieren:<\/p>\n<p>Schnell schauen, welche Abfragen mit with_objects oder require_objects generiert werden:<\/p>\n<p>Alle Artikel, mit LEFT OUTER JOIN auf die Tabelle partsgroup<br \/>\n<code> my $parts = SL::DB::Manager::Part-&gt;get_all( with_objects =&gt; [ 'partsgroup' ] );<\/code><\/p>\n<p>Nur die Waren, die eine Warengruppe haben:<br \/>\n<code> my $parts = SL::DB::Manager::Part-&gt;get_all( require_objects =&gt; [ 'partsgroup' ] );<\/code><\/p>\n<p>Oder der Unterschied in der Abfrage, ob man einen Artikel per<br \/>\n<code> my $part = SL::DB::Part-&gt;new( id =&gt; 962 )-&gt;load;<\/code><br \/>\noder per<br \/>\n<code> my $part = SL::DB::Manager::Part-&gt;find_by( id =&gt; 962 );<\/code><br \/>\nausliest.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So schick die Datenbankabfragen per Rose sind, will man doch ab und an schauen, was da im Hintergrund auf Datenbankebene passiert, also welche SQL-Queries eigentlich generiert werden. W\u00e4hrend man beim alten Code in der kivitendo.conf unter [debug] per global_level = QUERY noch alle SQL-Abfragen in der Logdatei protokollieren konnte, mu\u00df man bei Rose nun dbix_log4perl [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=\/wp\/v2\/posts\/419"}],"collection":[{"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=419"}],"version-history":[{"count":8,"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=\/wp\/v2\/posts\/419\/revisions"}],"predecessor-version":[{"id":631,"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=\/wp\/v2\/posts\/419\/revisions\/631"}],"wp:attachment":[{"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kivitendo.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}