【问题标题】:How to avoid MySQL warning to be escalated to an Exception in a Django application如何避免 MySQL 警告升级为 Django 应用程序中的异常
【发布时间】:2015-04-30 18:29:23
【问题描述】:

表中有一个varchar(5) 类型的列,它通常包含字符串格式的数字。有时它包含一些额外的字符,例如"5 CA"。我们将该列转换为数字以进行排序,这是通过额外的查询完成的:

qs.extra(select={'pnumsort':'main_person.player_number+0'}).order_by('pnumsort', "player_number")

问题是这个查询引起的警告在我的开发者框上升级为异常,所以请求失败。警告:

Warning at /players/data/players_table/ Truncated incorrect DOUBLE value: '5 CA'

对于该玩家编号列的内容包含一些额外非数字字符的每一行都有这样的警告。神秘的是,我的开发同事同事在他的盒子上根本没有收到错误(他可能有警告,但没有升级为错误)。测试系统有错误,幸好live没有。

到目前为止我发现了什么:

  1. 如果我尝试使用 qs.extra(select={'pnumsort':'CAST(main_person.player_number AS UNSIGNED)'}).order_by('pnumsort', "player_number")qs.extra(select={'pnumsort':'CONVERT(main_person.player_number, UNSIGNED)'}).order_by('pnumsort', "player_number"),我会收到相同的警告。而且由于警告,它仍然会导致我的系统出错。

  2. 有一张 Django 票可以追溯到 5 年前:https://code.djangoproject.com/ticket/12293 如果在 Django Python 应用程序中打开调试模式,这种行为(MySql 警告升级为错误)似乎是正常的。但是为什么我的同事没有收到错误呢?

  3. 该行为似乎不依赖于 MySql 版本、Django 版本或 MySql-python 版本。

    box | MySql version | MySql python version | Django DEBUG | problem

    my box | 5.6.24 | 1.2.5 final | True | Yes

    colleague | 5.1 | 1.2.3 final | True | No

    test | 5.5.38 | 1.2.3 final | True | Yes

    live | 5.5.x | 1.2.5 final | False | No

  4. 我尝试关闭 MySQL 严格模式(尽管不建议这样做)。我的同事在他的sql_mode(MySql 配置设置Disabling MySQL Strict Mode)中没有设置任何内容。清除sql_mode 也无济于事,尽管有趣的是PyCharm 数据库连接视图告诉它为其会话选择了STRICT 模式(SELECT @@SESSIon.slq_mode)。但是 PyCharm 使用 JDBC 连接 MySQL,所以它与 Django 和 MySQL-python 完全不同。

如何避免我的机器和测试服务器上的错误(由于 MySQL 警告)?为什么我的同事没有这个问题?

服务器是 Linux,开发环境是 Windows。

【问题讨论】:

标签: python mysql django mysql-python


【解决方案1】:

在执行查询之前,您可以在某处使用类似这样的代码忽略警告。

from warnings import filterwarnings
import MySQLdb as Database
filterwarnings('ignore', message="^Truncated incorrect DOUBLE value:.*", 
                category = Database.Warning)

更多信息请参见https://docs.python.org/2/library/warnings.html

【讨论】:

  • 这当然可以解决问题。为什么它会在某些系统上发生而在其他系统上不会发生,这仍然是一个谜。
  • 我在实时服务器的日志中看到它也遇到了这些警告。这不是关于他们的绊脚石
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多