首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以在DBIx::Class中漂亮地打印DBIC_TRACE输出吗?

我可以在DBIx::Class中漂亮地打印DBIC_TRACE输出吗?
EN

Stack Overflow用户
提问于 2009-02-17 12:31:48
回答 2查看 5.1K关注 0票数 22

将DBIC_TRACE环境变量设置为true:

代码语言:javascript
复制
BEGIN { $ENV{DBIC_TRACE} = 1 }

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

有没有一种方法可以通过某种"sql整洁“例程来更好地格式化它,也许可以将它分成多行?如果做不到这一点,有没有人能给我一点建议,告诉我在代码中我需要修改哪里才能添加这样的钩子?最好的工具是接受一个格式错误的SQL查询并推出一个格式良好的SQL查询吗?

在这个上下文中,“漂亮的格式化”仅仅意味着比“所有内容都在一行上”更好。我并不特别在意格式化查询的特定样式

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-20 08:33:26

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

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

票数 21
EN

Stack Overflow用户

发布于 2009-02-17 21:22:15

首先,感谢你的指点!以下是部分答案...

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

代码语言:javascript
复制
# 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的定义是:

代码语言:javascript
复制
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查询以便让我“美化”的问题。

然后我运行一个查询:

代码语言:javascript
复制
my $rs = $schema->resultset('SomeTable')->search(
    {   
        'email' => $email,
        'others.some_col' => 1,
    },
    { join => 'others' }
);
$rs->count;

但是,DBIx::Class:生成的SQL上的SQL::解析器barfs:

代码语言:javascript
复制
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更好的解析器呢?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/556590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档