19

Perl の DBI モジュールを使用しています。プレースホルダーを使用してステートメントを準備し、クエリを実行します。

パラメーターを手動でエスケープしてプレースホルダーにドロップせずに、実行された最終的なクエリを出力することは可能ですか?

ありがとう

4

8 に答える 8

17

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

于 2009-11-06T14:38:03.023 に答える
11

Statement属性を使用して、プリペアドステートメントのデバッグ印刷を実行できます。これには、「ステートメントハンドル」または「データベースハンドル」のいずれかを使用してアクセスできます。

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

print $dbh->{Statement} # with a database handle
于 2012-06-18T12:04:37.507 に答える
10

DBIが必ずしもそのようなクエリを生成するとは限らないため、一般的ではありません。データベースがAPIでプリペアドステートメントとプレースホルダーをサポートしている場合、DBIはそれらをパススルーし、データベースに作業を任せます。これが、プリペアドステートメントを使用する理由の1つです。

于 2009-11-06T13:58:47.357 に答える
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 メソッドのコールバックを記述して、好きなものを収集できます。

于 2012-06-18T13:20:00.147 に答える