SQL réelle déclaration après variables de liaison spécifiées
Question
Je suis en train de vous connecter chaque instruction SQL exécutée à partir de mes scripts. Cependant, je contemple un problème que je ne peux pas surmonter.
Est-il possible de calculer la déclaration réelle SQL après variables de liaison ont été spécifiées. En SQLite je devais calculer l'instruction à exécuter manuellement, en utilisant le code ci-dessous:
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
Il semble cx_Oracle a cursor.parse () installations. Mais je ne peux pas comprendre comment duper cx_Oracle pour calculer ma requête avant son exécution.
La solution
La requête est jamais calculé comme une seule chaîne. Le texte de la requête et les params sont jamais interpolée et ne produisent pas une vraie chaîne complète avec les deux.
C'est toute la question de l'utilisation des requêtes paramétrées - vous séparez la requête à partir des données - la prévention des injections sql et les limites d'un seul coup, et permettant l'optimisation des requêtes facile. La base de données obtient à la fois séparément et fait ce qu'il doit faire, sans jamais les joindre ensemble.
Cela dit, vous pouvez générer la requête vous, mais notez que la requête que vous générez, bien que probablement équivalent, n'est pas ce exécuté en réalité sur la base de données.
Autres conseils
Votre meilleur pari est de le faire au niveau du serveur de base de données, depuis un connecteur Oracle correctement mis en œuvre ne sera pas mis les variables de liaison dans une chaîne avant d'envoyer la requête au serveur. Voyez si vous pouvez trouver un paramètre de serveur Oracle qui le rend journal les requêtes qu'il exécute.
Vous voudrez peut-être envisager d'utiliser fonctionnalité de trace SQL étendue d'Oracle pour cela. Je recommande de commencer ici: http: //carymillsap.blogspot .com / 2011/01 / new-papier-maîtrise-performance with.html .