sql perl formatting dbix-class

sql - ¿Puedo imprimir bastante la salida DBIC_TRACE en DBIx:: Class?



perl formatting (3)

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

Lo que tengo hasta ahora ... primero algunos andamios:

# 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 My :: DBIx :: Class :: Storage :: Statistics es:

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; }

Lo cual resuelve el problema sobre cómo engancharme para obtener la consulta SQL para "pretty-ify".

Luego ejecuto 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 :: Class:

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

Entonces ... ¿hay un analizador mejor que SQL :: Analizador para el trabajo?

Estableciendo la variable de entorno DBIC_TRACE en verdadero:

BEGIN { $ENV{DBIC_TRACE} = 1 }

genera resultados muy útiles, especialmente mostrando la consulta SQL que se está ejecutando, pero la consulta SQL está en una sola línea.

¿Hay alguna forma de impulsarlo a través de una rutina un poco "ordenada en sql" 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 me preocupan especialmente los estilos específicos de las consultas de formato

¡Gracias!



De la documentación de DBIx :: Class :: Almacenamiento

Si se establece DBIC_TRACE, se genera información de seguimiento (como cuando se establece el método de depuración).

...

depurar
Hace que se emita información de rastreo en el objeto debugobj. (o STDERR si debugobj no se ha establecido específicamente).

debugobj
Establece o recupera el objeto utilizado para la recolección de métricas. Se predetermina a 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, debe establecer debugobj en esa clase a un objeto que subclasifique DBIx :: Class :: Storage :: Statistics . En su subclase, puede volver a formatear la consulta de la manera que desee.