tags:

views:

686

answers:

3

I would like to catch and log MySQL warnings in Python. For example, MySQL issues a warning to standard error if you submit 'DROP DATABASE IF EXISTS database_of_armaments' when no such database exists. I would like to catch this and log it, but even in the try/else syntax the warning message still appears.

The try/except syntax does catch MySQL errors (eg, submission of a typo like 'DRP DATABASE database_of_armaments').

I have experimented with <<except.MySQLdb.Warning>> -- no luck. I've looked at the warnings module, but don't understand how to incorporate it into the try/else syntax.

To be concrete, how do I get the following (or something like it) to work.

GIVEN: database 'database_of_armaments' does not exist.

try:
    cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
except: <<WHAT DO I PUT HERE?>>
    print 'There was a MySQL warning.' 
    <<AND what goes here if I want to get and manipulate information about the warning?>>

UPDATE:

Thanks for the comments. I had tried these and they didn't work -- but I had been using a DatabaseConnection class that I wrote for a connection, and its runQuery() method to execute. When I created a connection and cursor outside the class, the try/except Exception caught the "Programming Error", and except MySQLdb.ProgrammingError worked as advertised.

So now I have to figure out what is wrong with my class coding.

Thank you for your help.

+1  A: 

Follow these steps.

  1. Run it with except Exception, e: print repr(e).

  2. See what exception you get.

  3. Change the Exception to the exception you actually got.

Also, remember that the exception, e, is an object. You can print dir(e), e.__class__.__name__, etc.to see what attributes it has.

Also, you can do this interactively at the >>> prompt in Python. You can then manipulate the object directly -- no guessing.

S.Lott
A: 

Have you tried something like this?

try:
    cursor.execute(some_statement)
except MySQLdb.IntegrityError, e: 
    # handle a specific error condition
except MySQLdb.Error, e:
    # handle a generic error condition
except MySQLdb.Warning, e:
    # handle warnings, if the cursor you're using raises them
karlcow
A: 

I think the exception you want to catch is a MySQLdb.ProgrammingError, and to get information about it, just add a variable to store the error data (a tuple) in after that i.e:

try:
    cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
except MySQLdb.ProgrammingError, e:
    print 'There was a MySQL warning.  This is the info we have about it: %s' %(e)
dangerouslyfacetious
Don't you mean MySQLdb.OperationalError (instead of ProgrammingError)?
elo80ka
This is the exception that was being thrown for me in a similar project I'm working on. And yes I did think it was odd.
dangerouslyfacetious
Thanks, this was helpful.
chernevik