捕获MySql警告

时间:2010-01-20 14:59:40

标签: python mysql

在我的python脚本中,我想捕获“数据截断列'xxx'”警告使用MySql查询我的查询。

我看到一些帖子提示下面的代码,但它没有用。

您是否知道在使用此代码之前是否必须导入某个特定模块或是否应调用某个选项/标志?

全部谢谢

Afeg

import MySQLdb
try:
    cursor.execute(some_statement)
    # code steps always here: No Warning is trapped
    # by the code below
except MySQLdb.Warning, e:
    # handle warnings, if the cursor you're using raises them
except Warning, e:
    # handle warnings, if the cursor you're using raises them

7 个答案:

答案 0 :(得分:44)

警告只是:警告。他们被报告(通常)stderr,但没有其他任何事情。你不能像异常一样抓住它们,因为它们没有被提升。

但是,您可以使用warnings模块配置带有警告的的内容,并将其关闭或将其转换为例外。例如,warnings.filterwarnings('error', category=MySQLdb.Warning)MySQLdb.Warning warnings转换为异常(在这种情况下,它们将使用您的try / except捕获)或'ignore'根本不显示它们。您可以(也可能应该)拥有比类别更细粒度的过滤器。

答案 1 :(得分:9)

将MySQL警告提升为错误:

import warnings, MySQLdb
warnings.filterwarnings('error', category=MySQLdb.Warning)

要忽略而不是引发错误,请将"error"替换为"ignore"

将它们放在try-except块中,例如:

try:
    # a MySQL DB operation that raises a warning
    # for example: a data truncated warning
except Warning as a_warning:
    # do something here

答案 2 :(得分:5)

我会先尝试设置sql_mode。您可以在会话级别执行此操作。如果你执行:

SET @@sql_mode:=TRADITIONAL;

(您也可以在服务器级别设置它,但是您需要访问服务器来执行此操作。并且,在会话级别仍然会覆盖该设置,因此底线是,始终在会话中设置它等级,建立连接后立即)

然后很多通常警告的东西都会变成错误。我不知道那些如何在python级别上表现出来,但明显的优势是更改不会存储在数据库中。请参阅:http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_traditional

答案 3 :(得分:5)

如果你想让它忽略它,请参阅Python文档中的“暂时禁止警告”:

https://docs.python.org/2/library/warnings.html#temporarily-suppressing-warnings

import warnings

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    # Put here your query raising a warning

否则,只需阅读有关Python的“警告”模块的文档,如果您想稍后捕获它们,可以将它们转换为异常......等等......这些都在这里:https://docs.python.org/2/library/warnings.html

答案 4 :(得分:4)

只需添加Thomas Wouters的回复,就无需导入警告模块将其变为错误。只需使用“-W error”(或忽略)作为Python的标志运行脚本。

答案 5 :(得分:2)

您是否尝试过使用MySQL的SHOW WARNINGS命令?

答案 6 :(得分:2)

停止使用MySQLdb。它具有截断数据和仅发出警告等愚蠢行为。请改用oursql