gpt4 book ai didi

python - Django 过滤 MySQL 警告

转载 作者:太空狗 更新时间:2023-10-29 21:07:49 27 4
gpt4 key购买 nike

在你们都指向我之前herehere我的有点不同。因此,在转移到我的生产服务器后,我开始遇到这个著名的错误。

django/db/backends/mysql/base.py:86: Warning: Data truncated for column 'slug' at row 1

解决问题后,我做的第一件事就是开始使用谷歌搜索。为了解决这个问题,我调整了两个模型,使 max_length 为 128 ad,然后更新了 SQL 表以匹配它。 但问题仍然存在.. 有点自信,我确实解决了这个问题,我想我也应该开始过滤掉它们。所以我在脚本的顶部放置了这个。

# Get rid of the MySQLdb warnings
import warnings
import MySQLdb
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=MySQLdb.Warning)

我很高兴将其投入生产。你猜怎么着 - 你猜对了,问题仍然存在。那么现在怎么办。我很快就失去了信心,我确实解决了这个问题,但仔细检查表明所有的 slug 列都是 128 个字符长。此外,如果它长于 128,我将 sluggify 包装为错误,但仍然没有。所以 2 个问题:

  1. 我怎样才能确定什么操作正在标记这个。即在我的哪里代码是旗帜升起了吗?

  2. 我怎样才能真正过滤掉这些?我的修复不起作用?这真的是 MySQLdb 警告还是 django.db.mysql.base 警告?

谢谢,Django hacking 快乐!

对于那些对结构有疑问的​​人..

CREATE TABLE `people_employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`email` varchar(75) DEFAULT NULL,
`location_id` varchar(100) DEFAULT NULL,
`jpeg` longtext,
`first_name` varchar(100) DEFAULT NULL,
`last_name` varchar(100) DEFAULT NULL,
`maildomain` varchar(32) DEFAULT NULL,
`mailserver` varchar(32) DEFAULT NULL,
`mailfile` varchar(64) DEFAULT NULL,
`contractor` tinyint(1) NOT NULL,
`temporary` tinyint(1) NOT NULL,
`formal_name` varchar(100) DEFAULT NULL,
`nickname` varchar(32) DEFAULT NULL,
`cell_phone` varchar(32) DEFAULT NULL,
`office_phone` varchar(32) DEFAULT NULL,
`other_phone` varchar(32) DEFAULT NULL,
`fax` varchar(32) DEFAULT NULL,
`assistant_id` int(11) DEFAULT NULL,
`supervisor_id` int(11) DEFAULT NULL,
`is_supervisor` tinyint(1) NOT NULL,
`department_id` varchar(100) DEFAULT NULL,
`division_id` varchar(100) DEFAULT NULL,
`section_id` varchar(100) DEFAULT NULL,
`job_classification_id` varchar(100) DEFAULT NULL,
`functional_area_id` varchar(100) DEFAULT NULL,
`position_id` varchar(100) DEFAULT NULL,
`notes_url` varchar(200) DEFAULT NULL,
`ldap_active` tinyint(1) NOT NULL,
`notes_active` tinyint(1) NOT NULL,
`created_at` datetime NOT NULL,
`last_update` datetime NOT NULL,
`is_active` tinyint(1) NOT NULL,
`site_id` int(11) NOT NULL,
`slug` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `slug` (`slug`),
KEY `people_employee_location_id` (`location_id`),
KEY `people_employee_assistant_id` (`assistant_id`),
KEY `people_employee_supervisor_id` (`supervisor_id`),
KEY `people_employee_department_id` (`department_id`),
KEY `people_employee_division_id` (`division_id`),
KEY `people_employee_section_id` (`section_id`),
KEY `people_employee_job_classification_id` (`job_classification_id`),
KEY `people_employee_functional_area_id` (`functional_area_id`),
KEY `people_employee_position_id` (`position_id`),
KEY `people_employee_site_id` (`site_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1429 DEFAULT CHARSET=latin1;

以及相关的models.py。

slug = models.SlugField(max_length=128, editable=False, unique=True)

希望对您有所帮助..

最佳答案

首先,我强烈建议不要像这样过滤警告:这个错误是由 MySQL 产生的,它绝对意味着你正在丢失数据。

要做的第一件事是使用 MySQL describe 命令来确保您的数据库列实际定义为您期望的相同大小:如果您更改列的长度,Django 不支持数据库迁移,所以如果您的 slug 字段比现在短,您需要手动更改表格以设置新长度:

mysql> DESCRIBE my_table slug;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| slug | varchar(255) | NO | UNI | NULL | |
+-------+--------------+------+-----+---------+-------+
1 row in set (0.00 sec)

如果该字段不是您所期望的,您可以通过更新列长度来简单地解决问题:

mysql> ALTER TABLE my_table MODIFY slug VARCHAR(255) NOT NULL;

如果您在 slug 中允许使用 Unicode 字符,这也可以解释为您上面的转储似乎使用的是 latin1 字符集而不是 UTF-8 – 单个 UTF-8 字符最多可以是 4 个字节的数据,这意味着短至 17 个字节的值可能会溢出 VARCHAR(64)

下一个调试步骤是对过滤警告的调用的简单变体,以找出错误发生的确切位置:

warnings.simplefilter("error",  category=MySQLdb.Warning)

这将使警告致命,这将停止您的程序,但更重要的是还会产生堆栈跟踪。有了这样的东西,你会看到下面的输出:

#!/usr/bin/env python
import warnings

def foo():
warnings.warn("uhoh")

def bar():
foo()

def main():
warnings.simplefilter("error", UserWarning)
bar()

if __name__ == "__main__":
main()

没有 simplefilter 调用:

cadams@Io:~ $ python test_warnings.py 
test_warnings.py:5: UserWarning: uhoh
warnings.warn("uhoh")

使用 simplefilter 调用:

cadams@Io:~ $ python test_warnings.py 
Traceback (most recent call last):
File "test_warnings.py", line 15, in <module>
main()
File "test_warnings.py", line 12, in main
bar()
File "test_warnings.py", line 8, in bar
foo()
File "test_warnings.py", line 5, in foo
warnings.warn("uhoh")
UserWarning: uhoh

关于python - Django 过滤 MySQL 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409282/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com