Frage

Ich versuche, jede SQL-Anweisung aus meiner Skripte ausgeführt loggt sein. Jedoch habe ich ein Problem betrachten kann ich nicht überwinden.

Gibt es eine Möglichkeit SQL-Anweisung zu berechnen nach Bind-Variablen angegeben wurden. In SQLite hatte ich die Anweisung zur Berechnung manuell ausgeführt werden, unter Verwendung von Code unter:

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

Es scheint cx_Oracle hat cursor.parse () Einrichtungen. Aber ich kann nicht herausfinden, wie cx_Oracle Trick meine Abfrage vor der Ausführung zu berechnen.

War es hilfreich?

Lösung

Die Abfrage ist nie als einzelne Zeichenfolge berechnet. Der eigentliche Text der Abfrage und die params sind nie interpoliert und nicht produzieren eine echte vollständige Zeichenfolge mit beiden.

Das ist der springende Punkt parametrisiert Abfragen mit - Sie trennen die Abfrage vom Daten - verhindert SQL-Injektionen und Einschränkungen in einem Rutsch, und die eine einfache Abfrageoptimierung. Die Datenbank wird separat beide, und tut, was es tun muss, ohne sie jemals miteinander zu verbinden.

sagte, dass Sie die Abfrage generieren könnte sich selbst, aber beachten Sie, dass die Abfrage, die Sie erzeugen, wenn auch wahrscheinlich gleichwertig, ist nicht das, was tatsächlich auf der Datenbank ausgeführt wird.

Andere Tipps

Am besten ist es auf dem Datenbank-Server zu tun, da ein richtig implementiert Oracle Connector nicht die Bind-Variablen in einen String gesetzt werden, bevor die Abfrage an den Server sendet. Sehen Sie, wenn Sie eine Oracle-Server-Einstellung finden können, die es die Abfragen log macht es ausgeführt wird.

Sie möchten Oracle erweiterte SQL-Trace-Funktion für diese Verwendung zu berücksichtigen. Ich würde empfehlen, beginnend hier: http: //carymillsap.blogspot .com / 2011/01 / neu-Papier-Mastering-Performance-with.html .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top