2017-09-07 7 views
0

En Python, j'utiliser le connecteur mysql pour effectuer des requêtes, avec des paramètres séparés comme:Imprimer cursor.statement avec des paramètres en cas d'erreur connecteur mysql

cursor.execute("update tableA set a=%s,b=%s,c=%s", [1,2,3]) 

Je sais que lorsqu'une requête a réussi je peux utiliser:

print(cursor.statement) 

mais comment puis-je obtenir la requête réelle incluant les paramètres si j'obtiens une erreur?

Je voudrais obtenir:

"update tableA set a=1,b=2,c=3" 

Répondre

1

Vous savez qu'une requête a réussi (au moins sur le plan technique - si le résultat est ce que vous attendiez est un autre problème) parce qu'il n'a pas soulevé d'exception. Donc, la réponse est évidente: attraper l'exception et imprimez vos params à partir de là:

myquery = "..." 
try: 
    cursor.execute("myquery", params) 
except MySQLdb.MySQLError as e: 
    # using the logging package would be better 
    print("query '{}' with params {} failed with {}".format(myquery, params, e)) 
    # let the error propagate if you don't 
    # know how to/cannot handle it at this point 
    raise 

EDIT: si vous voulez obtenir la dernière requête qui a été exécuté, il n'y a rien qui est officially specified by the db api specs. Pour MySQLdb, il y a une méthode non documentée Connection.literal(args) encore publique que vous pouvez utiliser avec votre requête et params, à savoir:

sql = myquery % yourdbconnection.literal(params) 
    print("query '{}' failed with {}".format(sql, e)) 

FWIW qui est exactement comment la requête exécutée est construite (cf la source de MySQLdb.cursor.execute()). Maintenant, même s'il est public (non préfixé par _), il n'est toujours pas documenté, donc il n'y a pas de garantie que cela fonctionnera dans la prochaine version - et bien sûr, il est spécifique à l'implémentation, donc il ne fonctionnera pas avec n'importe quel autre connecteur db-api.

+0

Merci, mais ce n'est pas exactement ce que je voulais dire, j'ai mis à jour ma question. – user3605780

+0

Cf ma réponse mise à jour. –