我有一个夹具(json),它在开发环境中加载但在服务器环境中无法加载。错误说:“DatabaseError: value too long for type character varying(50)
”
我的开发环境是Windows& Postgres 8.4。服务器运行Debian和Postgres 8.3。两个系统中的数据库编码都是UTF8。
就好像夹具中的unicode标记计为服务器上的字符,它们会导致某些字符串超出其字段的最大长度。然而,这在开发环境中不会发生..
答案 0 :(得分:10)
更新:Django 1.8中的50个字符限制is now 255
-
原始答案:
我今天下午刚刚遇到这个,我有一个修复(种类)
这个post here暗示它是一个Django错误,与auth_permission允许的值的长度有关。进一步的挖掘支持这个想法,就像this Django ticket一样(即使它最初与MySQL有关)。
基本上是基于模型的verbose_name和描述性权限字符串创建权限名称,并且可以溢出到auth.models.Permission.name中允许的超过50个字符。
引用Django票的评论:
auth_permission.name列中字符串值的最长前缀是“可以更改”和“可以删除”,两者都有11个字符。列的最大长度为50,因此Meta.verbose_name的最大长度为39.
一种解决方案是破解该列以支持> 50个字符(理想情况是通过南迁移,我说,这很容易重复)但是我能想到的最快,最可靠的修复只是让我的超长verbose_name定义更短(从verbose_name中的47个字符到大约20)。现在一切正常。
答案 1 :(得分:8)
那么,区别在于模板数据库的编码。在生产服务器上,他们使用ascii编码,而在dev框中则为utf-8。
默认情况下,postgres使用template1创建数据库。我的理解是,如果它的编码不是utf-8,那么即使你用utf-8编码创建它,你创建的数据库也会遇到这个问题。
因此我删除它并将其编码设置为UTF8重新创建它。下面的代码片段(取自here):
psql -U postgres
UPDATE pg_database SET datallowconn = TRUE where datname = 'template0';
\c template0
UPDATE pg_database SET datistemplate = FALSE where datname = 'template1';
drop database template1;
create database template1 with template = template0 encoding = 'UNICODE';
UPDATE pg_database SET datistemplate = TRUE where datname = 'template1';
\c template1
UPDATE pg_database SET datallowconn = FALSE where datname = 'template0';
现在夹具装载顺利。
答案 2 :(得分:2)
在两个系统上获取真正的SQL查询,看看有什么不同。
答案 3 :(得分:1)
仅供参考:我也有此错误
DatabaseError: value too long for type character varying(10)
似乎我正在为一个字段写入超过10的数据。我通过将CharField的大小从10增加到20来修复它
我希望它有所帮助
答案 4 :(得分:1)
正如@stevejalim所说,很可能列auth_permission.name是长度为50的问题,你可以在postgres的shell中使用\ d + auth_permission进行验证。在我的情况下,这是问题,因此当我加载django模型的灯具时,我得到“DatabaseError:值太长,类型字符变化(50)”,然后更改django.contrib.auth的权限模型很复杂,所以...简单解决方案是在Permission模型上执行迁移,我在postgres的shell中运行了ALTER TABLE auth_permission ALTER COLUMN name TYPE VARCHAR(100);
命令,这对我有用。
答案 5 :(得分:1)
您可以通过在使用模型创建数据库表之前对模型进行猴子修补,使Django为此模型使用更长的字段。在“manage.py”中,更改:
if __name__ == "__main__":
execute_manager(settings)
为:
from django.contrib.auth.models import Permission
if __name__ == "__main__":
# Patch the field width to allow for our long model names
Permission._meta.get_field('name').max_length=200
Permission._meta.get_field('codename').max_length=200
execute_manager(settings)
这会在(例如)运行manage.py syncdb
之前修改字段上的选项,因此数据库表具有很好的宽varchar()字段。调用应用程序时不需要这样做,因为您从不尝试修改正在运行的权限表。