2

スクリプトから実行されたすべてのSQLステートメントをログに記録しようとしています。しかし、私は克服できない1つの問題を考えています。

バインド変数が指定された後に実際のSQLステートメントを計算する方法はありますか?SQLiteでは、以下のコードを使用して、手動で実行されるステートメントを計算する必要がありました。

def __sql_to_str__(self, value,args):
    for p in args:
        if type(p) is IntType or p is None:
            value = value.replace("?", str(p) ,1)
        else:
            value = value.replace("?",'\'' + p + '\'',1)
    return value

CX_Oracleにはcursor.parse()機能があるようです。しかし、CX_Oracleをだまして、実行前にクエリを計算する方法がわかりません。

4

3 に答える 3

7

クエリが単一の文字列として計算されることはありません。クエリの実際のテキストとパラメータが補間されることはなく、両方を含む実際の完全な文字列は生成されません。

これが、パラメーター化されたクエリを使用することの全体的なポイントです。つまり、クエリをデータから分離します。SQLインジェクションと制限を一度に防止し、クエリの最適化を容易にします。データベースは両方を別々に取得し、それらを結合することなく、必要なことを実行します。

とはいえ、自分でクエリを生成することもできますが、生成するクエリは、おそらく同等ではありますが、データベースで実際に実行されるものではないことに注意してください。

于 2011-01-14T17:34:51.933 に答える
1

適切に実装されたOracleコネクタは、サーバーにクエリを送信する前にバインド変数を文字列に入れないため、最善の策はデータベースサーバーで行うことです。実行するクエリをログに記録するOracleサーバー設定を見つけることができるかどうかを確認してください。

于 2011-01-14T17:38:14.283 に答える
0

これには、Oracleの拡張SQLトレース機能の使用を検討することをお勧めします。ここから始めることをお勧めします:http: //carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html

于 2011-01-14T19:31:39.537 に答える