创建models.py时发现row size太大问题,如何解决

Posted

技术标签:

【中文标题】创建models.py时发现row size太大问题,如何解决【英文标题】:When creating models.py ,the row size too large issue is found ,how to solve this problem 【发布时间】:2020-03-16 01:15:37 【问题描述】:

如何解决这个问题:

引发 errorclass(errno, errval) django.db.utils.InternalError: (1118, u'行大小太大。使用的表类型的最大行大小, 不计算 BLOB,是 65535。这包括存储开销,请检查 手册。您必须将某些列更改为 TEXT 或 BLOB')

请帮忙解决这个问题,下面是模型代码:

from django.db import models

class Newsdeatils(models.Model):
    news_provider_id = models.CharField(max_length=5000)
    news_title =  models.CharField(max_length=5000)
    news_details = models.CharField(max_length=5000)
    news_image = models.CharField(max_length=5000)
    news_page_url = models.CharField(max_length=5000)
    next_page = models.CharField(max_length=5000)
    news_des = models.CharField(max_length=5000)

【问题讨论】:

为什么要这么多最大长度?如果你有更多的字符,最好添加 TextFiled 【参考方案1】:

对于这样的长度要求,只需使用TextField。

通常,TextFields 并没有真正限制到特定的长度 w.r.t。实现限制(关于文件系统或使用的通用数据库系统)。 TextFields 的行为与 CharFieldsin 用法非常相似。 您可以阅读 here 的差异。

你的代码会变成这样:

from django.db import models

class Newsdeatils(models.Model):
    news_provider_id = models.TextField(max_length=5000)
    news_title =  models.TextField(max_length=5000)
    news_details = models.TextField(max_length=5000)
    news_image = models.TextField(max_length=5000)
    news_page_url = models.TextField(max_length=5000)
    next_page = models.TextField(max_length=5000)
    news_des = models.TextField(max_length=5000)

请注意,不需要在TextField 上设置max_length 属性(使用CharField 时需要)。这个max_length 属性也不是在数据库级别上强制执行的,而是仅用于表单验证。

您的模型中需要考虑的其他事项: 为什么news_provider_idCharField?那不应该是ForeignKey吗? news_image 字段也是如此。这应该是BinaryField

【讨论】:

当我应用时,news_provider_id = models.TextFiled(max_length = 5000),AttributeError: 'module' object has no attribute 'TextFiled'。问题就形成了 因为它拼写为“TextField”而不是“TextFiled”。您的型号名称中可能还有拼写错误,应该是“Newsdetail”而不是“Newsdeatils”。此外,如果这解决了您的问题,请考虑接受此答案。 然后也形成了同样的问题,文件“/home/prvak/Documents/duklr/venv/local/lib/python2.7/site-packages/pymysql/err.py”,第109行,在 raise_mysql_exception raise errorclass(errno, errval) django.db.utils.InternalError: (1118, u'Row size too large. 使用的表类型的最大行大小,不包括 BLOB,是 65535。这包括存储开销,检查手册。你必须将一些列更改为 TEXT 或 BLOBs')在这里我安装 pip install pymysql,你能帮我解决这个问题吗 我不确定这是否与您发布的模型有关。如果您将所有 CharFields 更改为 TextFields,则不应发生这种情况。是否有其他模型使用具有如此高 max_length 属性的 CharFields?另外,这个错误什么时候发生?更改为 TextFields 后是否运行 manager.py makemigrations && migrate?

以上是关于创建models.py时发现row size太大问题,如何解决的主要内容,如果未能解决你的问题,请参考以下文章

Django models拆分

Django models.py创建数据库

django使用models创建表

如何测试 django 数据库模式?

Python的Django框架完成一个完整的论坛(3.创建app的models.pyviews.py源码)

django 反向生成models.py