Дамп подготовленный SQL-запрос из оператора DBI в PERL - PullRequest
7 голосов
/ 04 мая 2011

Я использую DBI в Perl для подключения к моей базе данных PostgreSQL. Все работает нормально, но в моей отладке (результаты печати и т. Д.) Я не могу увидеть, действительно ли запрос, подготовленный модулем DBI perls, действительно правильный.

У меня есть что-то вроде этого:

$sth->prepare( qq{SELECT * FROM company WHERE companyname LIKE ? AND city = ?});
$sth->execute( $name.'%', $city);

Я не могу увидеть, как выглядит SQL-запрос после вызова execute, поскольку execute - это последний шаг, когда параметры связаны с запросом.

Я хотел бы иметь что-то вроде $sth->getLastExecutedQuery() или что-то подобное, чтобы увидеть, как выглядит запрос.

В этом случае функция getLastExecutedQuery() вернет:

SELECT * FROM company WHERE companyname LIKE 'Company Name%' AND city = 'City name';

Есть ли способ получить это? Это только для целей отладки.

Ответы [ 3 ]

6 голосов
/ 04 мая 2011

DBI поддерживает следующее: Существует метод DBI->trace($tracefile_handle) (отслеживает все взаимодействия DBI), или $dbh->trace($tracefile_handle), который отслеживает только взаимодействия на определенном дескрипторе. По умолчанию для вывода задано значение STDERR, но, указав $tracefile_handle, вы можете явно отправить вывод в другой файл (или просто использовать перенаправление оболочки).

DBD :: pg также поддерживает $h->trace('SQL'); Это должно поддерживаться драйвером DBD для работы, но, к счастью, DBD :: Pg поддерживает эту функцию.

Документация для DBI, на CPAN - DBI , и для DBD :: Pg в CPAN - DBD :: Pg действительно дает вам все, что вам нужно знать о трассировке.

6 голосов
/ 04 мая 2011

Использовать средство трассировки DBI . Это работает так:

use strict;
use warnings;
use DBI;
my %opt = ( RaiseError => 1 );
my $dbh = DBI->connect( 'dbi:mysql:test', 'fred', 'secret', \%opt );
$dbh->trace(2); # level 2 shows statement with inserted parameters
my $sql_i = 'insert into t1 (a, b) values ( ?, ? )';
my $sth_i = $dbh->prepare( $sql_i );
for ( qw/ eins zwei drei / ) {
    $sth_i->execute( $_, $_ );
}
$dbh->disconnect;
5 голосов
/ 04 мая 2011

Помимо отслеживания, о котором упоминали другие, вы должны взглянуть на https://metacpan.org/pod/DBI#Statement, который дает вам последний выполненный SQL, и https://metacpan.org/pod/DBI#ParamValues и https://metacpan.org/pod/DBI#ParamTypes, которые сообщают вам о ваших параметрах.

Существует также DBIx :: Log4perl , который может регистрировать то, что вы хотите, без всей трассировки DBI.

...