将DBIC_TRACE环境变量设置为true:
BEGIN { $ENV{DBIC_TRACE} = 1 }
生成非常有用的输出,特别是显示正在执行的SQL查询,但SQL查询只在一行上。
有没有一种方法可以通过某种"sql整洁“例程来更好地格式化它,也许可以将它分成多行?如果做不到这一点,有没有人能给我一点建议,告诉我在代码中我需要修改哪里才能添加这样的钩子?最好的工具是接受一个格式错误的SQL查询并推出一个格式良好的SQL查询吗?
在这个上下文中,“漂亮的格式化”仅仅意味着比“所有内容都在一行上”更好。我并不特别在意格式化查询的特定样式
谢谢!
发布于 2010-12-20 08:33:26
As of DBIx::Class 0.08124 it's built in.
只需将$ENV{DBIC_TRACE_PROFILE}
设置为console
或console_monochrome
即可。
发布于 2009-02-17 21:22:15
首先,感谢你的指点!以下是部分答案...
到目前为止我所得到的..。首先是一些脚手架:
# 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::解析器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更好的解析器呢?
https://stackoverflow.com/questions/556590
复制相似问题