【问题标题】:Django fixture fails, stating "DatabaseError: value too long for type character varying(50)"Django 夹具失败,说明“DatabaseError: value too long for type character varying(50)”
【发布时间】:2011-04-17 17:48:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: django postgresql utf-8


    【解决方案1】:

    在两个系统上获取真正的 SQL 查询,看看有什么不同。

    【讨论】:

    • 好的提示+1,同时检查服务器日志。
    【解决方案2】:

    更新:Django 1.8 中的 50 个字符限制 is now 255

    --

    原答案:

    我今天下午也遇到了这个问题,我有一个解决方法

    post here 暗示这是一个 Django 错误,与 auth_permission 允许的值的长度有关。进一步挖掘支持了这个想法,this Django ticket 也是如此(即使它最初与 MySQL 相关)。

    基本上是根据模型的详细名称加上描述性权限字符串创建权限名称,并且可以溢出到 auth.models.Permission.name 中允许的 50 多个字符。

    引用 Django 票的评论:

    auth_permission.name 列中字符串值的最长前缀是“Can change”和“Can delete”,均为 11 个字符。列最大长度为 50,因此 Meta.verbose_name 的最大长度为 39。

    一种解决方案是破解该列以支持 > 50 个字符(我说,理想情况下是通过南迁移,以便它很容易重复),但我能想到的最快、最可靠的解决方法就是让我的额外 - long verbose_name 定义要短得多(从 verbose_name 中的 47 个字符到大约 20 个)。现在一切正常。

    【讨论】:

    • 感谢您的回复,但您的解决方案仅限于身份验证。不幸的是,在我的情况下,任何 char 字段似乎都能引发错误。
    • 它不会是任何字符域 - 它只会是 50 个字符长的字符域。使用 --verbosity=2 运行 syncdb 以查看它具体阻塞了哪个模型,这可能会让您了解哪些模型实际上导致了痛苦。另外,Debian 机器上的语言环境是否正确?我记得它默认为 UTF8 或 16 以外的其他值,具体取决于您所在的位置(例如,在 GB 中,它默认为 LATIN1,当输入非 ASCII 字符时会爆炸)
    【解决方案3】:

    嗯,不同之处在于模板数据库的编码。在生产服务器上,他们有 ascii 编码,而在开发盒上它是 utf-8。

    默认情况下,postgres 使用模板 1 创建一个数据库。我的理解是,如果它的编码不是utf-8,那么你创建的数据库会出现这个问题,即使你是用utf-8编码创建的。

    因此,我删除了它并重新创建了它,并将其编码设置为 UTF8。下面的 sn-p 做到了(取自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';
    

    现在夹具加载顺利。

    【讨论】:

    • 非常感谢 - 解决了 django-testing 创建 utf8 数据库的整个问题。
    【解决方案4】:

    仅供参考:我也有这个错误

    DatabaseError: value too long for type character varying(10)
    

    似乎我正在为一个字段写入超过 10 个限制的数据。我通过将 CharField 的大小从 10 增加到 20 来修复它

    希望对你有帮助

    【讨论】:

      【解决方案5】:

      正如@stevejalim 所说,auth_permission.name 列很可能是长度为 50 的问题,您可以在 postgres 的 shell 中使用 \d+ auth_permission 验证这一点。就我而言,这是问题所在,因此当我加载 django 模型的固定装置时,我得到“DatabaseError: value too long for type character varying(50)”,然后更改 django.contrib.auth 的权限模型很复杂,所以......简单解决方案是在 Permission 模型上执行迁移,我在 postgres 的 shell 中运行 ALTER TABLE auth_permission ALTER COLUMN name TYPE VARCHAR(100); 命令,这对我有用。

      感谢this comment

      【讨论】:

        【解决方案6】:

        您可以通过在使用模型创建数据库表之前对模型进行猴子修补,使 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 运行之前修改字段上的选项,因此 databate 表有很好的宽 varchar() 字段。调用应用时无需这样做,因为您从不尝试在运行时修改 Permissions 表。

        【讨论】:

          猜你喜欢
          • 2021-09-09
          • 2020-04-07
          • 2012-07-03
          • 2022-11-18
          • 2019-04-22
          • 1970-01-01
          • 1970-01-01
          • 2016-05-30
          • 2017-04-17
          相关资源
          最近更新 更多