2009-02-17 22 views
17

Thiết lập biến môi trường DBIC_TRACE true:Tôi có thể in đẹp DBIC_TRACE đầu ra trong DBIx :: Class không?

BEGIN { $ENV{DBIC_TRACE} = 1 } 

tạo ra rất hữu ích, đặc biệt là thể hiện các truy vấn SQL đang được thực hiện, nhưng truy vấn SQL là trên cùng một dòng.

Có cách nào để đẩy nó thông qua một số loại "sql gọn gàng" thường xuyên để định dạng nó tốt hơn, có lẽ phá vỡ nó lên trên nhiều dòng? Không có điều đó, bất cứ ai có thể cho tôi một nudge vào nơi trong mã tôi cần phải hack để thêm một móc như vậy? Và công cụ nào tốt nhất là chấp nhận truy vấn SQL được định dạng sai và đẩy ra một truy vấn được định dạng tốt?

"định dạng đẹp" trong ngữ cảnh này đơn giản có nghĩa là tốt hơn "tất cả trên một dòng". Tôi không đặc biệt lo lắng về các kiểu truy vấn định dạng cụ thể

Cảm ơn!

+0

Tôi sử dụng mô-đun này để giải quyết hai vấn đề, 1) liên kết truy vấn được hiển thị với một chương trình con cụ thể qua theo dõi và 2) in đẹp: https://gist.github.com/jar-o/25ba571709de15a83361 – jar

Trả lời

10

Từ các tài liệu của DBIx :: Class :: lưu trữ

Nếu DBIC_TRACE được thiết lập sau đó theo dõi thông tin được sản xuất (như khi các phương pháp debug được thiết lập).

...

gỡ lỗi
Gây ra thông tin theo dõi được phát ra trên đối tượng debugobj . (hoặc STDERR nếu debugobj chưa được thiết lập cụ thể).

debugobj
Đặt hoặc truy lục đối tượng được sử dụng để thu thập số liệu. Mặc định cho một thể hiện của DBIx :: Class :: Storage :: Thống kê là tương thích với phương pháp gốc sử dụng một coderef như một cuộc gọi lại. Xem lớp Thống kê nói trên để biết thêm thông tin.

Nói cách khác, bạn nên đặt debugobj trong lớp đó thành đối tượng phân lớp DBIx::Class::Storage::Statistics. Trong lớp con của bạn, bạn có thể định dạng lại truy vấn theo cách bạn muốn.

2

Đầu tiên, cảm ơn các con trỏ! Câu trả lời một phần sau ....

Những gì tôi đã có cho đến nay ... đầu tiên một số giàn giáo:

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

Và định nghĩa của :: DBIx :: Class :: lưu trữ :: thống kê My là :

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; 
} 

Điều này giải quyết được vấn đề về cách móc vào để truy vấn SQL cho tôi "khá-ify".

Sau đó, tôi chạy một truy vấn:

my $rs = $schema->resultset('SomeTable')->search(
    { 
     'email' => $email, 
     'others.some_col' => 1, 
    }, 
    { join => 'others' } 
); 
$rs->count; 

Tuy nhiên SQL :: Parser barfs trên SQL được tạo ra bởi DBIx :: Class:

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 

Vì vậy, ... là có một phân tích cú pháp tốt hơn SQL :: Trình phân tích cú pháp cho công việc?

+0

Tôi không ' t nghĩ rằng có, nhưng SQL :: Parser có vẻ là trong phát triển tích cực (cập nhật cuối cùng là 6 tháng 2 năm nay). Bạn nên đảm bảo rằng bạn đã có phiên bản mới nhất và nếu nó vẫn bị hỏng, hãy liên hệ với người duy trì mô-đun và báo cáo lỗi của bạn: http://rt.cpan.org/Public/Dist/Display.html?Name=SQL-Statement –

+4

Có một mô-đun hoàn toàn mới trên CPAN được gọi là SQL :: Làm đẹp: SQL :: Làm đẹp - Điều: http://annocpan.org/dist/SQL-Beautify Có thể nó làm những gì bạn cần. – innaM

Các vấn đề liên quan