Ответ 1
Начиная с DBIx:: Class 0.08124 он встроен.
Просто установите $ENV{DBIC_TRACE_PROFILE}
на console
или console_monochrome
.
Установка переменной среды DBIC_TRACE в значение true:
BEGIN { $ENV{DBIC_TRACE} = 1 }
генерирует очень полезный вывод, особенно показывая SQL-запрос, который выполняется, но SQL-запрос находится в одной строке.
Есть ли способ проталкивать его через некоторую "обычную" процедуру, чтобы отформатировать ее лучше, возможно, разбить ее на несколько строк? В противном случае, может кто-нибудь дать мне толчок в том, где в коде, который мне нужно будет взломать, чтобы добавить такой крючок? И какой лучший инструмент - принять плохо отформатированный SQL-запрос и вытащить красиво отформатированный?
"Хорошее форматирование" в этом контексте просто означает лучше, чем "все в одной строке". Я не особо суетился о конкретных стилях запросов форматирования.
Спасибо!
Начиная с DBIx:: Class 0.08124 он встроен.
Просто установите $ENV{DBIC_TRACE_PROFILE}
на console
или console_monochrome
.
Из документации DBIx:: Class:: Storage
Если DBIC_TRACE установлен, тогда выводится информация о трассировке (например, когда метод отладки установлен).
...debug
Причиняет информацию о трассировке на debugobj объект. (или STDERR, если debugobj специально не установлен).debugobj
Устанавливает или извлекает объект, используемый для сбора метрик. По умолчанию используется экземпляр DBIx:: Class:: Storage:: Статистика, которая совместимый с исходным методом использования coderef в качестве обратного вызова. Для получения дополнительной информации см. Вышеупомянутый класс статистики.
Другими словами, вы должны установить debugobj
в этом классе для объекта, который подклассы DBIx::Class::Storage::Statistics. В вашем подклассе вы можете переформатировать запрос так, как хотите.
Во-первых, спасибо за указатели! Частичный ответ следует....
То, что у меня есть до сих пор... сначала некоторые леса:
# 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 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 barfs на SQL, сгенерированном 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
Итак... есть ли более эффективный парсер, чем SQL:: Parser для задания?