Django夹具失败,说“DatabaseError:值太长,类型字符变化(50)”

时间:2010-09-27 12:02:44

标签: django postgresql utf-8

我有一个夹具(json),它在开发环境中加载但在服务器环境中无法加载。错误说:“DatabaseError: value too long for type character varying(50)

我的开发环境是Windows& Postgres 8.4。服务器运行Debian和Postgres 8.3。两个系统中的数据库编码都是UTF8。

就好像夹具中的unicode标记计为服务器上的字符,它们会导致某些字符串超出其字段的最大长度。然而,这在开发环境中不会发生..

6 个答案:

答案 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);命令,这对我有用。

this comment

的学分

答案 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()字段。调用应用程序时不需要这样做,因为您从不尝试修改正在运行的权限表。