【问题标题】:Can I pretty-print the DBIC_TRACE output in DBIx::Class?我可以在 DBIx::Class 中漂亮地打印 DBIC_TRACE 输出吗?
【发布时间】:2017-06-15 16:25:52
【问题描述】:

将 DBIC_TRACE 环境变量设置为 true:

BEGIN { $ENV{DBIC_TRACE} = 1 }

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

有没有办法通过某种“sql tidy”例程来更好地格式化它,也许将它分成多行?如果做不到这一点,谁能给我一个提示,我需要破解代码中的哪个位置来添加这样的钩子?最好的工具是接受格式错误的 SQL 查询并推出格式良好的查询?

在这种情况下,“漂亮的格式”仅仅意味着比“全部在一行上”更好。我对格式查询的特定样式并不特别在意

谢谢!

【问题讨论】:

    标签: sql perl formatting dbix-class


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      来自 DBIx::Class::Storage 的文档

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

      ...

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

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

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

      【讨论】:

        【解决方案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;
        

        但是 SQL::Parser 对由 DBIx::Class 生成的 SQL 不满意:

        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 更好的解析器来完成这项工作?

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-23
        • 2016-08-26
        • 1970-01-01
        • 2021-01-17
        • 2013-05-24
        • 1970-01-01
        • 2017-12-19
        相关资源
        最近更新 更多