75 votes

Imprimer la requête actuelle de MySQLdb?

Je suis à la recherche d'un moyen de déboguer des requêtes comme ils sont exécutés, et je me demandais si il existe un moyen d'avoir MySQLdb imprimer la requête réelle qu'elle s'exécute, après qu'il a terminé d'insérer les paramètres et tout ça? À partir de la documentation, il semble comme si il n'est pas censé être un Cursor.info() l'appel qui donnera des informations sur la dernière exécution de la requête, mais cela n'existe pas sur ma version (1.2.2).

Cela semble être une question évidente, mais pour toutes mes recherches je n'ai pas été en mesure de trouver la réponse. Merci à l'avance.

121voto

xitrium Points 1023

Nous avons trouvé un attribut sur l'objet curseur appelé "_last_executed" contenant la dernière chaîne de requête à exécuter même lorsqu'une exception se produit. Pour nous, c'était plus facile et meilleur en production que d'utiliser le profilage à tout moment ou la consignation de requêtes MySQL, car ces deux solutions ont un impact sur les performances et impliquent plus de code ou plus de corrélations entre des fichiers journaux séparés, etc.

Déteste répondre à ma propre question, mais cela fonctionne mieux pour nous.

37voto

moose Points 4945

Vous pouvez imprimer la dernière requête exécutée avec l’attribut curseur _last_executed :

 try:
    cursor.execute(sql, (arg1, arg2))
    connection.commit()
except:
    print(cursor._last_executed)
    raise
 

31voto

maremmle Points 156

Pour moi / pour le moment _last_executed ne fonctionne plus. Dans la version actuelle à laquelle vous souhaitez accéder

curor.statement .

voir: https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html

7voto

unutbu Points 222216

Une façon de le faire est d'activer le profilage:

cursor.execute('set profiling = 1')
try:
    cursor.execute('SELECT * FROM blah where foo = %s',[11])
except Exception:
    cursor.execute('show profiles')
    for row in cursor:
        print(row)        
cursor.execute('set profiling = 0')

les rendements

(1L, 0.000154, 'SELECT * FROM blah where foo = 11')

Avis de l'argument(s) ont été insérés dans la requête, et que la requête a été enregistré bien que l'échec de la requête.

Une autre façon est de démarrer le serveur de journalisation est activée:

sudo invoke-rc.d mysql stop
sudo mysqld --log=/tmp/myquery.log

Ensuite, vous avez à parcourir /tmp/myquery.journal pour savoir ce que le serveur a reçu.

-1voto

Nick Craig-Wood Points 18742

Je ne peux pas dire que j'ai jamais vu

 Cursor.info()
 

Dans la documentation, et je ne parviens pas à le trouver après quelques minutes de recherche. Peut-être que vous avez vu une vieille documentation?

En attendant, vous pouvez toujours activer MySQL Query Logging et consulter les fichiers journaux du serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X