Domanda

Sto cercando di registrare ogni istruzione SQL eseguita dai miei scritti. Tuttavia contemplo un problema che non riesco a superare.

C'è un modo per calcolare istruzione SQL reale dopo sono state specificate le variabili di bind. In SQLite Ho dovuto calcolare la dichiarazione deve essere eseguito manualmente, utilizzando il codice qui sotto:

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

Sembra cx_Oracle ha cursor.parse () strutture. Ma non riesco a capire come ingannare cx_Oracle calcolare la mia domanda prima della sua esecuzione.

È stato utile?

Soluzione

La query è non calcolato come una singola stringa. Il testo effettivo della query ei parametri sono non interpolati e non di produrre una vera e propria stringa completa con entrambi.

Questo è il punto centrale di utilizzare query con parametri - di separare la query dai dati - prevenire iniezioni SQL e limitazioni tutta d'un fiato, e permettendo l'ottimizzazione delle query facile. Il database si sia separatamente, e fa quello che deve fare, senza mai unirsi insieme.

Detto questo, si potrebbe generare la query da soli, ma è da notare che la query che si generano, anche se probabilmente equivalenti, non è ciò che viene effettivamente eseguito sul database.

Altri suggerimenti

La cosa migliore è di farlo al server di database, dal momento che un connettore di Oracle correttamente attuato non metterà le variabili di bind in una stringa prima di inviare la query al server. Vedere se è possibile trovare un ambiente server Oracle che lo rende registrare le query viene eseguita.

Si potrebbe desiderare di considerare l'utilizzo di funzionalità di traccia SQL esteso di Oracle per questo. Mi sento di raccomandare di iniziare qui: http: //carymillsap.blogspot .com / 2011/01 / nuova-paper-mastering-prestazioni-with.html .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top