Logs des requêtes SQL de Catalyst

user_icon admin | icon2 Catalyst | icon4 15/9/2007 14h48| Type doc: article| Type File: txt| icon3 No Comment

Log des requêtes SQL de Catalyst


1. Mais que fait Catalyst ?

Catalyst peut utiliser à peu près n'importe quel type de stockage des données via les modules Perl disponible. Par exemple Catalyst::Model::DBI peut être utilisé pour accéder simplement à une base de données. Cependant la plupart des applications Catalyst utilise la technique dite ORM (Object Relational Mapping) pour masquer la complexité d'une base de donnée. Le module Perl DBIx::Class a été développé pour faire ce travail.

DBIx::Class étant une couche d'abstraction aux base de données, il est très simple d'en changer le type. On peut très bien developper son application avec SQLite et la mettre en production sous Oracle :)

Avec ce dernier il est possible d'effectuer tous types de requêtes en ayant aucune connaissance du SQL. Le revers de la médaille étant que nous n'avons aucune connaissance des requêtes effectuées. C'est pourtant parfois bien utile.

2. En console

Catalyst nous founie une méthode simple permettant d'afficher les requêtes lors de l'exécution de l'application.

Il suffit pour cela d'exporter la variable DBIC_TRACE


export DBIC_TRACE=1
perl script/monapp_server.pl

Ainsi si je reprend l'application que nous avons développés avec FormFu ( Le source de celle-ci) et que je me logue sous http://localhost:3000/article, un SELECT extrait les articles de la base SQLite. Pour s'en convaincre :

[info] monapp powered by Catalyst 5.7006
You can connect to your server at http://localhost:3000
                SELECT me.id_article, me.titre, me.contenu FROM article me:
[info] *** Request 1 (0.125/s) [5786] [Sat Sep 15 12:47:42 2007] ***
[debug] "GET" request for "article" from "127.0.0.1"

3. Plus loin avec DBIx::Class::QueryLog

DBIx::Class::QueryLog logue chaque transaction exécutée ce qui nous permet d'analyser ce qu'il se passe dans une session. Il permet surtout d'afficher les requêtes les plus gourmande en temps.

La surcouche Catalyst::Model::DBIC::Schema::QueryLog intègre ce module à Catalyst.

3.1. Mise en pratique

A nouveau j'utiliserai l'exemple développé avec FormFu.

J'ajoute simplement la ligne suivante au modèle de la base SQLite ( lib/monapp/Model/MonModel.pm )

use base qw/Catalyst::Model::DBIC::Schema::QueryLog/;

Et je modifie le fichier template listant les articles ( root/article/list.tt ) en y ajoutant à la fin:


  <div class="featurebox">
    <h3>Query Log Report</h3>
    [% SET total = c.model('FilmDB').querylog.time_elapsed | format('%0.6f') %]
    <div>Total SQL Time: [% total | format('%0.6f') %] seconds</div>
    [% SET qcount = c.model('FilmDB').querylog.count %]
    <div>Total Queries: [% qcount %]</div>

    [% IF qcount %]
    <div>Avg Statement Time: [% (c.model('FilmDB').querylog.time_elapsed / qcount) | format('%0.6f') %] seconds.</div>
    <div>
     <table class="table1">
      <thead>
       <tr>

        <th colspan="3">5 Slowest Queries</th>
       </tr>
      </thead>
      <tbody>
       <tr>

        <th>Time</th>
        <th>%</th>
        <th>SQL</th>
       </tr>

       [% SET i = 0 %]
       [% FOREACH q = c.model('FilmDB').querylog_analyzer.get_sorted_queries %]
       <tr class="[% IF loop.count % 2 %]odd[% END %]">
        <th class="sub">[% q.time_elapsed | format('%0.6f') %]
        <td>[% ((q.time_elapsed / total ) * 100 ) | format('%i') %]%</td>
        <td>[% q.sql %] : ([% q.params.join(', ') %])</td>

       </th></tr>
       [% IF i == 5 %]
        [% LAST %]
       [% END %]
       [% SET i = i + 1 %]
       [% END %]
      </tbody>
     </table>
    </div>
    [% END %]
  </div>

Et donc si je me connecte à http://localhost:3000/article ça me donne:

Maintenant si j'ajoute un article:

Et si je supprime l'article 3:

Voili Voilà ...


Add a comment

Validator_logo
Catapulse v0.06
( 0.092732 s)