22

DBIC_TRACE 環境変数を true に設定します。

BEGIN { $ENV{DBIC_TRACE} = 1 }

特に実行中の SQL クエリを示す非常に役立つ出力を生成しますが、SQL クエリはすべて 1 行で表示されます。

おそらく複数の行に分割して、より適切にフォーマットするために、ある種の「sql tidy」ルーチンを介してプッシュする方法はありますか? それができない場合、そのようなフックを追加するためにハッキングする必要があるコードのどこに誰かが私に微調整を与えることができますか? また、不適切な形式の SQL クエリを受け入れて適切な形式の SQL クエリをプッシュするのに最適なツールは何でしょうか?

このコンテキストでの「適切な書式設定」は、単に「すべてを 1 行に」よりも優れていることを意味します。クエリの書式設定の特定のスタイルに特にこだわる必要はありません

ありがとう!

4

3 に答える 3

21

DBIx::Class 0.08124 から組み込まれています。

またはに設定$ENV{DBIC_TRACE_PROFILE}するだけです。consoleconsole_monochrome

于 2010-12-20T00:33:26.443 に答える
10

DBIx::Class::Storage のドキュメントから

DBIC_TRACE が設定されている場合、トレース情報が生成されます (デバッグ メソッドが設定されている場合と同様)。

...

debug
トレース情報が debugobj オブジェクトで発行されるようにします。(または、debugobj が特に設定されていない場合は STDERR)。

debugobj
メトリック収集に使用されるオブジェクトを設定または取得します。コードリファレンスをコールバックとして使用する元の方法と互換性のある DBIx::Class::Storage::Statistics のインスタンスにデフォルト設定されます。詳細については、前述の Statistics クラスを参照してください。

つまり、そのクラスをDBIx::Class::Storage::Statisticsdebugobjをサブクラス化するオブジェクトに設定する必要があります。サブクラスでは、クエリを希望どおりに再フォーマットできます。

于 2009-02-17T12:41:33.620 に答える
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よりも優れたパーサーはありますか?

于 2009-02-17T21:22:14.693 に答える