2010-11-10 2 views
6

je suis arrivé ce code ..Python et MySQLdb - Utiliser DROP TABLE IF EXISTS semble jeter exception

..... 
try: 
    task_db.cursor.execute('DROP TABLE IF EXISTS `tasks`') 
    print "Affected: %d" % task_db.cursor.rowcount 
except MySQLdb.Error, e: 
    print "Error ocurred: %s " % e.args[0] 
    print e 

Si la table des tâches n'existe pas, je reçois un avertissement comme

create_database.py:11: Warning: Unknown table 'tasks' 

Mais si la table existe, je ne recevrai pas cet avertissement. Odd?

Répondre

6

C'est un comportement parfaitement correct. Si la table existe, elle est supprimée. Si ce n'est pas le cas, vous obtenez Attention exception qui n'est pas la même que Erreur - vous êtes libre de l'ignorer et rien de mal ne devrait arriver, mais vous devez l'attraper pour permettre à votre script de continuer.

EDIT:

Pour éviter Avertissement de bouillonner, juste attraper comme toute autre exception:

try: 
    [some code] 
except MySQLdb.Warning: 
    [exception handling code] 
+0

soo ... ce qui est un moyen d'empêcher que d'être affiché dans la sortie? – Wizzard

+0

J'ai édité ma réponse –

+5

Attraper MySQLdb.Warning n'a rien fait pour moi. Voir [la réponse de thomdask] (http://stackoverflow.com/a/4830497/307705) pour un correctif alternatif. –

22

Attraper le MySQLdb.Warning ne fonctionnait pas pour moi, donc j'ai trouvé une autre façon de supprimer les avertissements:

import warnings 
warnings.filterwarnings("ignore", "Unknown table.*") 

Et vous pouvez éditer le second paramètre avec tout ce que vous voulez supprimer.

11

La façon la plus élégante pour éviter les avertissements Mysql:

from warnings import filterwarnings 
import MySQLdb 

filterwarnings('ignore', category = MySQLdb.Warning) 
+3

Il est en effet plus élégant que la réponse thomdask mais, ne serait-il pas affecter d'autres avertissements que nous pourrions ne pas vouloir ignorer? –

+0

@Roman, je pense que c'est un Je ne dirais pas que cette solution est plus élégante, elle est simplement différente, supprimant tous les avertissements et supprimant un avertissement spécifique. – chishaku