2009-11-06 8 views
13

मैं पर्ल के डीबीआई मॉड्यूल का उपयोग कर रहा हूं। मैं प्लेसहोल्डर का उपयोग करके एक बयान तैयार करता हूं, फिर क्वेरी निष्पादित करता हूं।पर्ल के डीबीआई प्लेसहोल्डर्स में भरने के बाद निष्पादित SQL क्वेरी को कैसे प्रिंट कर सकता हूं?

क्या अंतिम क्वेरी को प्रिंट करना संभव है जो मैन्युअल रूप से पैरामीटर से बचने और उन्हें प्लेसहोल्डर्स में छोड़ दिए बिना निष्पादित किया गया था?

धन्यवाद

+1

संभावित डुप्लिकेट [मैं डीबीआई को पैराम्स समेत सभी प्रश्नों को कैसे लॉग कर सकता हूं?] (Http://stackoverflow.com/questions/19703521/how-can-i-make-dbi-log-all-queries- समावेश- पैराम्स) – Jake

+0

@ जेक इस प्रश्न को दूसरे प्रश्न से 4 साल पहले पूछा गया था, इस सवाल के बेहतर जवाब हैं, (मेरी राय में)। यही कारण है कि मैंने दूसरे प्रश्न को डुप्लिकेट और बंद करने के लिए उम्मीदवार के रूप में चिह्नित किया है। – aidan

उत्तर

16

Tracing in DBI देखें। DBD::SQLite का उपयोग करके निम्न काम करता है लेकिन उत्पादन का एक बहुत पैदा करता है:

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

आउटपुट:

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

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

आदि आदि

आप कर सकते थे plug your own filter in to the trace stream के लिए एक ही रखने prepare रों ।

+1

मुझे ट्रेस के बारे में सिखाने के लिए उपरोक्त, भले ही यह सवाल का जवाब न दे (क्योंकि जैसा कि अन्य ने बताया, यह असंभव है)। और यह टिप्पणी सिर्फ इसलिए है क्योंकि मैं ऐसे उत्तर को उखाड़ फेंकने के लिए दोषी महसूस करता हूं जो मुझे पता है कि सवाल का जवाब नहीं है। lol: $ – msb

10
सामान्य रूप में

नहीं है, क्योंकि DBI जरूरी इस तरह के एक प्रश्न का उत्पादन नहीं करता। यदि आपका डेटाबेस अपने एपीआई में तैयार कथन और प्लेसहोल्डर्स का समर्थन करता है, तो डीबीआई उन्हें पास कर देगा और डेटाबेस को काम करने देगा, जो तैयार वक्तव्यों का उपयोग करने के कारणों में से एक है।

8

आप Statement विशेषता का उपयोग कर एक तैयार कथन का डीबग प्रिंट कर सकते हैं। इसे या तो "स्टेटमेंट हैंडल" या "डेटाबेस हैंडल" के साथ एक्सेस किया जा सकता है।

print $sth->{Statement} # with a statement handle 

print $dbh->{Statement} # with a database handle 
+1

यह केवल अंतिम 'तैयार' या 'do' को पारित स्ट्रिंग देता है, इसलिए ओपी अनुरोध के रूप में प्लेसहोल्डर भर नहीं जाते हैं। – ThisSuitIsBlackNot

+1

'प्रिंट डम्पर ($ statement_handle -> {' ParamValues ​​'}) का उपयोग कर सकते हैं; बाइंड पैरा को अलग से मुद्रित करने के लिए - अधिकांश प्रश्नों को डीबग करने के लिए पर्याप्त हो सकता है। – user1027562

1

जैसा कि मास्टो सामान्य रूप से एसक्यूएल में प्लेसहोल्डर सीधे आपके पैरामीटर के साथ प्रतिस्थापित नहीं होते हैं। पैरामीटरयुक्त एसक्यूएल का पूरा बिंदु एसक्यूएल है जो प्लेसहोल्डर्स को डेटाबेस इंजन में एक बार पार्स करने के लिए पास किया जाता है और फिर यह पैरामीटर प्राप्त करता है।

आईड्सएसएल नोट्स के रूप में आप एसक्यूएल को कथन या कनेक्शन हैंडल से वापस प्राप्त कर सकते हैं और आप ParamValues से पैरामीटर भी पुनर्प्राप्त कर सकते हैं। यदि आप इसे स्वयं नहीं करना चाहते हैं तो आप केवल SQL और पैरामीटर लॉग इन करने के लिए DBIx::Log4perl जैसे कुछ का उपयोग कर सकते हैं। DBIX_L4P_LOG_DELAYBINDPARAM जो कुछ इस तरह आउटपुट देखें:

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

के रूप में यह का उपयोग करता है के लिए लॉग :: Log4perl आप "डीबग -" छोड़ सकते हैं अगर आप चाहते हैं। डीबीआईएक्स :: लॉग 4perl here का उपयोग करने के लिए एक छोटा सा ट्यूटोरियल है।

आप किसी भी डीबीडी के साथ डीबीआईएक्स :: लॉग 4perl का उपयोग करने में सक्षम होना चाहिए और यदि आप इसे किसी कारण से आरटी नहीं कर सकते हैं और मैं इसे देख लूंगा।

यदि आप डीबीआईएक्स :: लॉग 4perl और डीबीआई ट्रेस विकल्पों के साथ नहीं जाना चाहते हैं तो आपकी जरूरतों के अनुरूप नहीं है, आप डीबीआई की तैयारी/चयन */निष्पादन विधियों के लिए कॉलबैक लिख सकते हैं और जो कुछ भी आप उन्हें पसंद करते हैं उसे इकट्ठा कर सकते हैं।

0

यदि आप अपना खुद का ट्रैसर मॉड्यूल (जैसा कि सिनन द्वारा सुझाया गया है) बनाना नहीं चाहते हैं, तो आप $sth->execute() पर जाने से पहले तर्क हैश मुद्रित करने की कोशिश कर रहे हैं। यह विशेष रूप से सच है, क्योंकि "ट्रेस" कार्यक्षमता डीबीएमएस निर्भर है और $sth->{Statement} केवल SQL प्लेसहोल्डर कथन देता है। मैंने जो किया है वह यहाँ है।

... 
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}); 
} 

मैं पाठ :: सीएसवी कहाँ का इस्तेमाल किया है ... नोट: यह सही { '} के डीबीएमएस कार्यान्वयन निर्भर हैंडलिंग के कारण नहीं है,।

1

यह सर्वर साइड के साथ DBD::mysql लिए काम करता है विकलांग (डिफ़ॉल्ट) तैयार:

$ DBI_TRACE=2 perl your-script-here 

यह एक बार मापदंडों बंधन और एक बार के बाद से पहले दो बार प्रत्येक कथन प्रिंट होगा। उत्तरार्द्ध अच्छी तरह से गठित एसक्यूएल होगा कि आप स्वयं को चला सकते हैं।

संबंधित मुद्दे