Perl DBI: как увидеть неудачный запрос со связанными значениями? - PullRequest
6 голосов
/ 24 июня 2011

Это стандартный пример вставки из DBI руководства:

     my $query = q{
       INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
     };
     my $sth = $dbh->prepare($query) or die $dbh->errstr;
     while (<>) {
         chomp;
         my ($product_code, $qty, $price) = split /,/;
         $sth->execute($product_code, $qty, $price) or die ($query . " " . $dbh->errstr);
     }
     $dbh->commit or die $dbh->errstr;

Я немного его изменил, так что я могу видеть на штампе, какой запрос не удался (die ($query . " " . $dbh->errstr)).Тем не менее я хотел бы видеть запрос со связанными значениями (как он был выполнен).Как это получить?


Редактировать

Кстати, я нашел неуклюжий способ видеть запрос со связанными значениями: вы должны сделать синтаксическую ошибку в запросе,Например, если я изменил приведенный выше запрос следующим образом:

     my $query = q{
       xINSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
     };

Я получил его обратно, как хотел:

DBD :: mysql :: st выполнить не удалось: у вас естьошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования около 'xINSERT INTO sample (product_code, qty, price) VALUES (' 1 ',' 2 ',' 3 ')' встрока 1

Иногда это действительно помогает.По крайней мере, мне это удалось.

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

Вы можете использовать DBI ParamValues ​​ для получения значений параметров, но вы вряд ли найдете какой-либо метод в DBD для получения параметров в действительности в SQL, поскольку они в основном отправляются в базу данных после SQL разобран. Вы можете посмотреть на DBIx :: Log4perl , чтобы увидеть, как ParamValues ​​используется в обработчике ошибок. Вам также могут пригодиться некоторые части DBIx :: Log4perl.

1 голос
/ 24 июня 2011

Нет стандартного способа сделать это. Ближайшим приближением будет замена каждого заполнителя значением (вероятно, указанным). В общем, довольно сложно надежно проанализировать инструкцию SQL, чтобы найти знаки вопроса, которые являются заполнителями, а не частями идентификаторов с разделителями, строк или комментариев. В этом примере вы можете просто искать знаки вопроса; это не всегда работает, хотя:

INSERT /* ? */ INTO "??".Sales VALUES('?', ?, ?, ?);

Обратите внимание, что с большинством, но не обязательно со всеми СУБД (и, следовательно, с большинством драйверов DBD), оператор отправляется СУБД при его подготовке; при выполнении инструкции отправляются только значения. Оператор никогда не создается со всеми значениями, подставляемыми в список VALUES, поэтому ни DBI, ни СУБД не должны его создавать.

0 голосов
/ 24 июня 2011

Я думаю, что нет никакого общего поддерживаемого способа DBI сделать это, но отдельные драйверы базы данных могут это позволить.Какую базу данных вы используете?

...