Đầ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?
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