django - 模型的 max_length 字段在 localhost 上不起作用
问题描述
我的模型有一个名为 title 的 CharField,其 max_length 设置为 30。我有一个解析器将数据解析到数据库,当我在本地主机上使用它时,我没有任何错误。
部署后,发生错误:
django.db.utils.DataError: value too long for type character varying(30)
我发现它正在尝试插入具有 35 个字符的值,但此错误未出现在我的本地主机上。我尝试使用 shell,并设法添加了一个包含 60 个字符的字段。怎么了?
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})'
解决方案
我发现它正在尝试插入具有 35 个字符的值,但此错误未出现在我的本地主机上。我尝试使用 shell,并设法添加了一个包含 60 个字符的字段。怎么了?
并非所有数据库在执行约束方面都那么严格。根据您的评论,您在本地主机上使用 SQLite。在SQLite的文档中,我们读到:
(...) 请注意, SQLite会忽略类型名称(例如:)后面的括号中的数字参数- SQLite 不会对字符串、BLOB 或数值的长度施加任何长度限制(除了大的全局限制) . (...)
VARCHAR(255)
SQLITE_MAX_LENGTH
这意味着尽管 Django 会添加长度约束,但数据库不会“强制”它。对于 SQLite,VARCHAR(1)
, VARCHAR(255)
,NCHAR(55)
都产生相同类型的列: a TEXT
。
在“生产服务器”端,您使用 PostgreSQL 数据库,并且根据文档,该数据库强制执行长度限制。在文档中,我们看到了示例:
INSERT INTO test2 VALUES ('too long'); ERROR: value too long for type character varying(5)
除了长度(这里5
),错误完全匹配。所以 PostgreSQL 确实强制了长度约束,并且没有接受数据。以上当然不是PostgreSQL产生错误的“确凿证据”,但需要大量的代码分析才能严谨地证实这一点,所以我希望这能让你信服。
因此,建议至少在(少量)时间内使用相同的“环境”测试您的应用程序,因为数据库、解释器等之间总是存在小的差异。是的,大多数数据库当然实现或多或少相同的系统,但有一些小的差异可能会产生一些影响。
推荐阅读
- postgresql - Windows 上的 pg_dump 将无关字符放入转储文件中?
- php - 如何记录对数据库中 REST API 的每个请求?
- python - 具有单个任务的 Apache Airflow DAG
- boringssl - Java 中的 BoringSSL SSL 日志
- java - 在每个新日期之前画线
- javascript - 如何单击视频以更改html中的视频源
- .net - 为 .net core asp.net 应用程序创建安装程序并在 setup 中配置 appsetings.json
- scikit-learn - SVR 估计器在训练后不包含支持向量
- sql - SQL中聚合函数AVG()的误用
- javascript - 再次单击设置时如何重置设置超时