2009-11-06 12 views
13

Używam modułu DBI Perla. Przygotowuję oświadczenie za pomocą symboli zastępczych, a następnie wykonuję zapytanie.Jak mogę wydrukować zapytanie SQL wykonane po tym, jak DBI Perla wypełnia obiekty zastępcze?

Czy to możliwe, aby wydrukować ostateczną kwerendę, która została wykonana ręcznie bez ucieczki parametry i upuszczając je w zastępcze?

Dzięki

+1

możliwy duplikat [Jak mogę utworzyć dziennik DBI dla wszystkich zapytań łącznie z parametrami?] (Http://stackoverflow.com/questions/19703521/how-can-i-make-dbi-log-all-queries-including params) – Jake

+0

@Jeśli to pytanie zostało zadane 4 lata przed innym pytaniem, również to pytanie ma lepsze odpowiedzi (według mnie). Właśnie dlatego zaznaczyłem drugie pytanie jako duplikat i kandydat do zamknięcia. – aidan

Odpowiedz

16

Zobacz Tracing in DBI. Następujące prace wykorzystujące DBD::SQLite ale produkuje dużo wyjściowa:

$dbh->trace($dbh->parse_trace_flags('SQL|1|test')); 

wyjściowa:

<- prepare('SELECT ... FROM ... WHERE ... = ?')= DBI::st=HASH(0x21ee924) at booklet-excel.pl line 213

<- execute('Inhaler')= '0E0' at booklet-excel.pl line 215

itp itd

Mogłabyś plug your own filter in to the trace stream zachować tylko prepare s .

+1

Rewizja za nauczanie mnie o śladzie, mimo że nie odpowiada na pytanie (ponieważ, jak inni zauważyli, jest to niemożliwe). I ten komentarz jest tutaj tylko dlatego, że czuję się winny za przegłosowanie odpowiedzi, o której wiem, że nie odpowiada na pytanie. lol: $ – msb

10

Nie na ogół, ponieważ DBI niekoniecznie generuje takie zapytanie. Jeśli twoja baza danych obsługuje przygotowane wyciągi i symbole zastępcze w interfejsie API, DBI przekaże je i pozwoli bazy danych wykonać pracę, co jest jedną z przyczyn używania przygotowanych wyciągów.

8

Można wykonać wydruk debugowania przygotowanym oświadczeniu za pomocą atrybutu Statement. Dostęp do tego można uzyskać za pomocą "instrukcji obsługi" lub "obsługi bazy danych".

+1

To po prostu zwraca ciąg przekazany do ostatniego 'przygotowania' lub' do', więc symbole zastępcze nie są wypełniane jako żądany OP. – ThisSuitIsBlackNot

+1

Można użyć 'print Dumper ($ statement_handle -> {'ParamValues'});' , aby wydrukować oddzielnie parametry wiązania - Może to być wystarczające do debugowania większości zapytań. – user1027562

1

Jak mówi masto, symbole zastępcze w SQL nie są bezpośrednio zastępowane parametrami. Cały sparametryzowany SQL to SQL z symbolami zastępczymi przekazywanymi do silnika bazy danych w celu jednorazowego analizowania, a następnie otrzymuje parametry.

Jako że idssl zauważa, że ​​możesz odzyskać SQL z instrukcji lub uchwytu połączenia, możesz również pobrać parametry od ParamValues. Jeśli nie chcesz tego zrobić samodzielnie, możesz użyć czegoś takiego, jak DBIx::Log4perl, aby zalogować się tylko z SQL i parametrami. Zobacz DBIX_L4P_LOG_DELAYBINDPARAM który wyprowadza coś takiego:

DEBUG - prepare(0.1): 'insert into mje values(?,?)' 
DEBUG - $execute(0.1) = [{':p1' => 1,':p2' => 'fred'},undef]; 

Oczywiście, ponieważ korzysta Log :: Log4perl można pominąć „DEBUG -” jeśli chcesz. Istnieje mały samouczek dotyczący korzystania z DBIx :: Log4perl here.

Powinieneś być w stanie wykorzystać DBIx :: Log4perl z dowolnym DBD a jeśli nie może z jakiegoś powodu RT go i będę na to patrzeć.

Jeśli nie chcesz korzystać z DBIx :: Log4perl, a opcje śledzenia DBI nie odpowiadają Twoim potrzebom, możesz pisać callbacki dla metod przygotowania/wyboru */execur DBI i zbierać to, co lubisz w nich.

0

Jeśli nie chcesz tworzyć własnego modułu śledzącego (zgodnie z sugestią Sinana), lepiej jest próbować wydrukować wartość skrótu, zanim zostanie przekazana do $sth->execute(). Jest to szczególnie prawdziwe, ponieważ funkcja "Trace" jest zależna od DBMS, a $sth->{Statement} zwraca jedynie instrukcję zastępczą SQL. Oto co zrobiłem.

... 
while (my $row = $csv->getline_hr($fh)) { 
    my $cval = ""; 
    my $tquery = $query; 
    foreach my $j (@cols) { 
      $cval = $row->{$j}; 
      $tquery =~ s/\?/\'$cval\'/; 
    } 
    print "$tquery\n\n"; 
    $rc = $sth->execute(@{$row}{@cols}); 
} 

Gdzie Użyłem Text :: CSV ... UWAGA: To nie jest dokładny, w związku z realizacją DBMS zależnej obsługi { '} s.

1

Działa to dla DBD::mysql z po stronie serwera przygotować wyłączone (domyślnie):

$ DBI_TRACE=2 perl your-script-here 

To będzie drukować każdą instrukcję dwukrotnie, raz przed wiążące parametry i raz po. Ten drugi będzie dobrze sformułowanym SQL, który możesz uruchomić samemu.