【问题标题】:Trapping MySQL Warnings In Python在 Python 中捕获 MySQL 警告
【发布时间】:2009-03-15 13:25:52
【问题描述】:

我想在 Python 中捕获并记录 MySQL 警告。例如,如果您在不存在此类数据库时提交'DROP DATABASE IF EXISTS database_of_armaments',MySQL 会向标准错误发出警告。我想捕捉并记录它,但即使在 try/else 语法中,警告消息仍然会出现。

try/except 语法确实捕获 MySQL 错误(例如,提交像 'DRP DATABASE database_of_armaments' 这样的错字)。

我已经尝试过<<except.MySQLdb.Warning>> -- 没有运气。我查看了警告模块,但不明白如何将其合并到 try/else 语法中。

具体来说,我如何使以下(或类似的)工作。

GIVEN:数据库“database_of_armaments”不存在。

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?>>

更新:

感谢 cmets。我试过这些,但它们没有用——但我一直在使用我为连接编写的 DatabaseConnection 类,以及它的 runQuery() 方法来执行。当我在类外创建连接和游标时,try/except 异常捕获了“编程错误”,并且除了 MySQLdb.ProgrammingError 之外的工作如宣传的那样。

所以现在我必须弄清楚我的类编码有什么问题。

感谢您的帮助。

【问题讨论】:

标签: python mysql


【解决方案1】:

按照这些步骤操作。

  1. 使用except Exception, e: print repr(e) 运行它。

  2. 看看你得到了什么异常。

  3. Exception 更改为您实际遇到的异常。

另外,请记住异常 e 是一个对象。你可以打印dir(e)e.__class__.__name__等,看看它有什么属性。

此外,您可以在 Python 中的 &gt;&gt;&gt; 提示符处以交互方式执行此操作。然后,您可以直接操作该对象——无需猜测。

【讨论】:

  • 这对我有帮助,因为 django 有用地使用了与底层 MySQL 连接器相同的异常名称; OperationalError。我将文件顶部的from MySQLdb import OperationalError 切换为from django.db.utils import OperationalError,我突然能够捕捉到异常。
【解决方案2】:

我设法像这样捕获 mysql 警告:

import _mysql_exceptions

try:
    foo.bar()
except _mysql_exceptions.Warning, e:
    pass

【讨论】:

    【解决方案3】:

    你尝试过这样的事情吗?

    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
    

    【讨论】:

    • 虽然这个答案可能更彻底,但它仍然比其他答案更好,我不明白为什么它会被否决。
    • @Flav 因为警告不raise
    【解决方案4】:

    我认为您要捕获的异常是 MySQLdb.ProgrammingError,要获取有关它的信息,只需在其后添加一个变量来存储错误数据(元组),即:

    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) 
    

    【讨论】:

    • 你不是说 MySQLdb.OperationalError(而不是 ProgrammingError)吗?
    • 这是在我正在从事的类似项目中为我抛出的异常。是的,我确实认为这很奇怪。
    【解决方案5】:

    首先您应该打开警告以将其视为异常,然后才能捕获它们。 请参阅“错误”警告过滤器 - https://docs.python.org/3/library/warnings.html#the-warnings-filter

    【讨论】:

    • 我怎样才能«打开警告以将其视为异常»?
    • @freezed 添加了文档中相关部分的链接。
    【解决方案6】:

    简单明了

    def log_warnings(curs):
        for msg in curs.messages:
            if msg[0] == MySQLdb.Warning:
                logging.warn(msg[1])
    
    cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
    log_warnings(cursor)
    

    msg[1] 示例:- (u'Warning', 1366L, u"Incorrect integer value: '\xa3' for column 'in_userid' at row 1")

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2018-05-02
      • 2015-09-28
      • 1970-01-01
      相关资源
      最近更新 更多