Perl の DBI モジュールを使用しています。プレースホルダーを使用してステートメントを準備し、クエリを実行します。
パラメーターを手動でエスケープしてプレースホルダーにドロップせずに、実行された最終的なクエリを出力することは可能ですか?
ありがとう
Perl の DBI モジュールを使用しています。プレースホルダーを使用してステートメントを準備し、クエリを実行します。
パラメーターを手動でエスケープしてプレースホルダーにドロップせずに、実行された最終的なクエリを出力することは可能ですか?
ありがとう
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
などなど
sのみを保持するために、独自のフィルターをトレース ストリームにプラグインできますprepare
。
Statement属性を使用して、プリペアドステートメントのデバッグ印刷を実行できます。これには、「ステートメントハンドル」または「データベースハンドル」のいずれかを使用してアクセスできます。
print $sth->{Statement} # with a statement handle
print $dbh->{Statement} # with a database handle
DBIが必ずしもそのようなクエリを生成するとは限らないため、一般的ではありません。データベースがAPIでプリペアドステートメントとプレースホルダーをサポートしている場合、DBIはそれらをパススルーし、データベースに作業を任せます。これが、プリペアドステートメントを使用する理由の1つです。
マストが一般的に言うように、SQL のプレースホルダーは直接パラメーターに置き換えられません。パラメーター化された SQL の要点は、プレースホルダーを含む SQL がデータベース エンジンに渡されて一度解析され、その後パラメーターを受け取ることです。
idssl のメモのように、ステートメントまたは接続ハンドルから SQL を取得できます。また、 ParamValuesからパラメーターを取得することもできます。これを自分で行いたくない場合は、DBIx::Log4perlのようなものを使用して、SQL とパラメーターだけをログに記録できます。次のような出力を出力する DBIX_L4P_LOG_DELAYBINDPARAM を参照してください。
DEBUG - prepare(0.1): 'insert into mje values(?,?)'
DEBUG - $execute(0.1) = [{':p1' => 1,':p2' => 'fred'},undef];
もちろん、Log::Log4perl を使用するため、必要に応じて "DEBUG - " を省略できます。DBIx::Log4perl を使用するための小さなチュートリアルがここにあります。
DBIx::Log4perl は任意の DBD で使用できるはずです。何らかの理由で使用できない場合は、RT してください。調べてみます。
DBIx::Log4perl を使用したくなく、DBI トレース オプションがニーズに合わない場合は、DBI の prepare/select*/execute メソッドのコールバックを記述して、好きなものを収集できます。