2009-02-17 77 views
17

的DBIC_TRACE環境變量設置爲true:我可以漂亮地打印DBIx :: Class中的DBIC_TRACE輸出嗎?

BEGIN { $ENV{DBIC_TRACE} = 1 } 

產生非常有用的輸出,尤其是顯示出正在執行的SQL查詢,但SQL查詢是所有在一行。

有沒有辦法推動它通過某種「SQL tidy」例程來更好地格式化它,也許把它分解成多行?如果沒有,那麼是否有人能夠推動我在需要破解的代碼中添加這樣一個鉤子?最好的工具是接受格式不正確的SQL查詢並推出格式良好的查詢?

在這種情況下,「不錯的格式化」僅僅意味着比「全部在一行上」更好。我對格式化查詢的具體樣式並不特別感興趣

謝謝!

+0

我使用這個模塊來解決兩個問題,1)通過跟蹤鏈接顯示的查詢與特定的子程序,2)漂亮的打印:https://gist.github.com/jar-o/25ba571709de15a83361 – jar 2016-01-31 01:16:53

回答

10

從DBIx ::類的文檔::存儲

如果DBIC_TRACE設置然後跟蹤信息產生時(當 調試方法被設置爲)。

...

debug
導致跟蹤信息在調試對象 對象上發出。 (或者如果debugobj沒有專門設置,則爲STDERR)。

debugobj
設置或檢索用於度量收集的對象。 默認爲與使用coderef作爲回調的原始方法兼容的DBIx :: Class :: Storage :: Statistics的一個實例,它與 兼容。 有關更多信息,請參閱上述統計類。

換句話說,您應該將該類中的debugobj設置爲子類爲DBIx::Class::Storage::Statistics的對象。在您的子類中,您可以按照您希望的方式重新格式化查詢。

2

首先,謝謝指點!部分答案如下....

我有什麼那麼遠,首先是一些腳手架:

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

和我:: DBIx ::類::存儲::統計被定義:

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 ::分析器barfs由DBIx ::類生成的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 ::解析器的工作?

+0

我不'不過認爲是存在的,但SQL :: Parser似乎處於積極的發展階段(最新更新是今年2月6日)。你應該確保你有最新版本,如果它仍然中斷,聯繫模塊維護者並報告你的bug:http://rt.cpan.org/Public/Dist/Display.html?Name=SQL-Statement – 2009-02-18 12:57:59