Model's max_length field doesn't work on localhost

时间:2018-10-02 09:19:35

标签: django django-models

My model has a CharField called title with a max_length set to 30. I have a parser that parses data to the database and when I use it all on my localhost I don't have any errors.

After deploying, it happened there was an error:

django.db.utils.DataError: value too long for type character varying(30)

I found that it's trying to insert value that has 35 characters but this error doesn't appear on my localhost. I tried using shell and I managed to add a field that had 60 characters. What's wrong?

class Coin(models.Model):
    symbol = models.CharField(max_length=20)
    title = models.CharField(max_length=30)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'{self.title} ({self.symbol})'

1 个答案:

答案 0 :(得分:1)

  

我发现它正在尝试插入具有35个字符的值,但是此错误未出现在我的本地主机上。我尝试使用Shell,设法添加了一个包含60个字符的字段。怎么了?

并非所有数据库在执行约束方面都如此严格。根据您的评论,您可以在本地主机上使用SQLite。在SQLite的文档中,我们阅读:

  

(...)请注意,SQLite-会忽略类型名称(例如:VARCHAR(255)后面的括号中的数字参数 。 SQLite不会对字符串,BLOB或数字值的长度施加任何长度限制(除了较大的全局SQLITE_MAX_LENGTH限制)。 (...)

因此,这意味着尽管Django将添加长度限制,但数据库不会“强制”它。对于SQLite,VARCHAR(1)VARCHAR(255)NCHAR(55)都会产生相同类型的列:TEXT

在“生产服务器”端,您使用PostgreSQL数据库,该数据库的名称为per documentation,用于限制长度。在文档中,我们看到了示例:

INSERT INTO test2 VALUES ('too long');
ERROR:  value too long for type character varying(5)

除长度(此处为5)外,错误完全匹配。因此PostgreSQL确实实施了长度限制,并且不接受数据。上面的内容当然不是“冒烟的证据”,表明该错误是由PostgreSQL生成的,但是需要大量代码分析才能以严格的方式确认此错误,因此,我希望这能使您信服。

因此,建议至少在相同的“环境”下测试您的应用程序一段时间(少量),因为数据库,解释器等之间总是存在很小的差异。是的,大多数数据库当然或多或少地实现相同的系统,但是有一些细微的差异可能会产生一些影响。