2009-02-17 17 views
17

establecer la variable de entorno DBIC_TRACE true:¿Puedo imprimir bastante la salida DBIC_TRACE en DBIx :: Class?

BEGIN { $ENV{DBIC_TRACE} = 1 } 

genera una salida muy útil, especialmente mostrando la consulta SQL que está siendo ejecutado, pero la consulta SQL es todo en una línea.

¿Hay alguna forma de impulsarlo a través de una rutina un poco "ordenada" para formatearlo mejor, quizás dividiéndolo en varias líneas? Si eso falla, ¿alguien podría darme un empujón hacia dónde en el código necesitaría hackear para agregar un gancho? ¿Y cuál es la mejor herramienta para aceptar una consulta SQL mal formateada y sacar una muy bien formateada?

"buen formato" en este contexto simplemente significa mejor que "todo en una línea". No estoy particularmente preocupado por los estilos específicos de las consultas de formato

¡Gracias!

+0

Utilizo este módulo para resolver dos problemas, 1) vincular la consulta mostrada con una subrutina específica a través del seguimiento, y 2) imprimir bonita: https://gist.github.com/jar-o/25ba571709de15a83361 – jar

Respuesta

10

De la documentación de DBIx :: :: Clase de almacenamiento

Si DBIC_TRACE se establece a continuación, la información se produce (como cuando se establece el método de depuración ) rastrear.

...

depuración
Causas información de seguimiento que se emitirá en el debugobj objeto. (o STDERR si debugobj no se ha establecido específicamente).

debugobj
Establece o recupera el objeto utilizado para la recopilación de métricas. Se establece de forma predeterminada en una instancia de DBIx :: Class :: Storage :: Statistics que es compatible con el método original de usar un coderef como devolución de llamada. Consulte la clase de Estadísticas mencionada anteriormente para obtener más información.

En otras palabras, se debe configurar debugobj en esa clase a un objeto que subclases DBIx::Class::Storage::Statistics. En su subclase, puede volver a formatear la consulta de la manera que desee.

2

Primero, gracias por los consejos! respuesta parcial sigue ....

Lo que tengo hasta ahora ... primero un andamio:

# Connect to our db through DBIx::Class 
my $schema = My::Schema->connect('dbi:SQLite:/home/me/accounts.db'); 

# See also BEGIN { $ENV{DBIC_TRACE} = 1 } 
$schema->storage->debug(1); 

# Create an instance of our subclassed (see below) 
# DBIx::Class::Storage::Statistics class 
my $stats = My::DBIx::Class::Storage::Statistics->new(); 

# Set the debugobj object on our schema's storage 
$schema->storage->debugobj($stats); 

y la definición de Mis :: Estadísticas :: DBIx Class :: :: Almacenamiento siendo :

package My::DBIx::Class::Storage::Statistics; 

use base qw<DBIx::Class::Storage::Statistics>; 
use Data::Dumper qw<Dumper>; 
use SQL::Statement; 
use SQL::Parser; 

sub query_start { 
    my ($self, $sql_query, @params) = @_; 

    print "The original sql query is\n$sql_query\n\n"; 

    my $parser = SQL::Parser->new(); 
    my $stmt = SQL::Statement->new($sql_query, $parser); 
    #printf "%s\n", $stmt->command; 

    print "The parameters for this query are:"; 
    print Dumper \@params; 
} 

que resuelve el problema de cómo conectar en conseguir la consulta SQL para mí "bastante-ify".

Luego ejecutar una consulta:

my $rs = $schema->resultset('SomeTable')->search(
    { 
     'email' => $email, 
     'others.some_col' => 1, 
    }, 
    { join => 'others' } 
); 
$rs->count; 

Sin embargo SQL :: Parser barfs en el SQL generado por DBIx :: Clase:

The original sql query is 
SELECT COUNT(*) FROM some_table me LEFT JOIN others other_table ON (others.some_col_id = me.id) WHERE (others.some_col_id = ? AND email = ?) 

SQL ERROR: Bad table or column name '(others' has chars not alphanumeric or underscore! 

SQL ERROR: No equijoin condition in WHERE or ON clause 

Así que ... ¿Hay un programa de análisis mejor que SQL :: Analizador para el trabajo?

+0

No lo hago Creo que existe, pero SQL :: Parser parece estar en desarrollo activo (la última actualización fue el 6 de febrero de este año). Debe asegurarse de tener la última versión, y si aún se rompe, póngase en contacto con el responsable del mantenimiento del módulo e informe su error: http://rt.cpan.org/Public/Dist/Display.html?Name=SQL-Statement –

+4

Hay un módulo completamente nuevo en CPAN llamado SQL :: Embellecer: SQL :: Embellecer - Artículo: http://annocpan.org/dist/SQL-Beautify Quizás haga lo que necesita. – innaM

Cuestiones relacionadas