我可以在DBIx :: Class中打印DBIC_TRACE输出吗?

时间:2009-02-17 12:31:48

标签: sql perl formatting dbix-class

将DBIC_TRACE环境变量设置为true:

BEGIN { $ENV{DBIC_TRACE} = 1 }

生成非常有用的输出,特别是显示正在执行的SQL查询,但SQL查询全部在一行上。

有没有办法通过某种“sql tidy”例程来推动它更好地格式化,也许可以通过多行来分解它?如果不这样做,任何人都可以给我一个推动代码中我需要破解添加这样一个钩子的地方吗?最好的工具是接受格式错误的SQL查询并推出格式良好的SQL查询?

在这种情况下,“漂亮的格式化”仅仅意味着比“一条线上的所有”更好。我并不特别关注格式化查询的特定样式

谢谢!

3 个答案:

答案 0 :(得分:21)

As of DBIx::Class 0.08124 it's built in.

只需将$ENV{DBIC_TRACE_PROFILE}设置为consoleconsole_monochrome

答案 1 :(得分:10)

来自DBIx :: Class :: Storage

的文档
  

如果设置了DBIC_TRACE,则会生成跟踪信息(如同   调试方法已设定)。

...

     

debug
导致在debugobj上发出跟踪信息   宾语。 (如果没有专门设置debugobj,则为STDERR。)

     

debugobj
设置或检索用于度量标准收集的对象。   默认为DBIx :: Class :: Storage :: Statistics的实例   兼容使用coderef作为回调的原始方法。   有关详细信息,请参阅上述统计类。

换句话说,您应该将该类中的debugobj设置为子类DBIx::Class::Storage::Statistics的对象。在您的子类中,您可以按照您希望的方式重新格式化查询。

答案 2 :(得分:3)

首先,感谢指点!部分答案如下......

到目前为止我得到的......首先是一些脚手架:

# 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);

My :: DBIx :: Class :: Storage :: Statistics的定义为:

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

这解决了如何挂钩以使我的SQL查询“非常好”的问题。

然后我运行一个查询:

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

但是,由DBIx :: Class生成的SQL上的SQL :: Parser barfs:

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

那么......对于这项工作,是否有比SQL :: Parser更好的解析器?