2011-05-04 4 views
7

내 PostgreSQL 데이터베이스에 연결하기 위해 Perl에서 DBI를 사용하고 있습니다. 모든 것이 잘 작동하지만 내 디버깅 (인쇄 결과 등)에서 iam은 perls DBI 모듈로 준비된 쿼리가 실제로 올바른지 확인할 수 없습니다. 매개 변수 쿼리에 바인더 제본하는 최신 단계 실행으로, SQL 쿼리 실행 호출 한 후 모양을 볼 수PERL의 DBI 문에서 SQL 쿼리를 덤프하십시오

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

스피 수 없습니다 :

나는 이런 식으로 뭔가가있다.

$sth->getLastExecutedQuery()과 같은 검색어를 사용하고 싶습니다. 이 경우

기능 getLastExecutedQuery()는 반환이 얻을 수있는 방법이

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

있습니까? 디버깅 목적으로 만 사용됩니다.

답변

5

DBI는 다음을 지원합니다 특정 핸들에 바로 상호 작용을 추적 할 것 DBI->trace($tracefile_handle) 방법 (모든 DBI 상호 작용을 추적), 또는 $dbh->trace($tracefile_handle)이 있습니다. 출력 기본값은 STDERR이지만, $tracefile_handle을 제공하면 명시 적으로 출력을 다른 파일로 보내거나 셸 리다이렉션을 사용할 수 있습니다.

DBD :: pg도 지원됩니다. $h->trace('SQL');이 작업은 DBD 드라이버가 지원해야하며, 다행히도 DBD :: Pg가이 기능을 지원합니다.

CPAN - DBI, 및 CPAN - DBD::Pg의 DBD :: Pg에 대한 문서는 실제로 추적에 대해 알아야 할 모든 정보를 제공합니다. 트레이싱 다른 사람을 넘어

+0

아. 감사. – NovumCoder

5

DBI tracing facility을 사용하십시오. 그것은 다음과 같이 작동

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; 
+0

그래도 오류가있는 경우에만 작동합니다. 그래서 흔적이 STDERR로 갈 것입니까? 오류가 있었는지 여부에 관계없이 모든 쿼리를 받고 싶습니다. 나는 파일 이름을 trace()에 제공 할 수 없다는 것을 알고 있지만, 문서에서는 오류 케이스가 아니라 항상 문서를 작성하는 것에 대해 준비 할 수 없습니다. – NovumCoder

관련 문제