【问题标题】:DatabaseError: value too long for type character varying(100)DatabaseError:类型字符变化的值太长(100)
【发布时间】:2012-02-20 14:35:28
【问题描述】:

我有一个 Django 网站,运行我们多年前在内部构建的迷你 CMS,它使用的是 postgresql。保存简单标题和一段文本时,出现以下错误:

value too long for type character varying(100)

奇怪的是,没有一个列在变化(100),它们都是 200 或 250,即使是默认的 Django 列也由于 re-opened ticket mentioned here 而从 100 更改为 200

有人知道这个问题的解决方法吗?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    对于 FileField 和 ImageField,来自 Django 文档:

    FileField 实例在您的数据库中创建为 varchar 列,默认最大长度为 100 个字符。与其他字段一样,您可以使用 max_length 参数更改最大长度。

    【讨论】:

      【解决方案2】:

      该值可以是 100 或 25 或 17 等等,其背后的原因是模型,搜索您添加特定长度(17,25)的位置,您将得到错误! ,

      您正试图强加一个比提到的更长的字段长度。

      这解决了我的问题,希望对你也有帮助

      【讨论】:

      • 问题与此无关。 slug 的默认最大长度是 50(或者可能是在我第一次问这个问题的时候),但是 slug 比 50 长,所以它正在创建错误。向 slugfield 添加 max_length 解决了这个问题
      • 先生,我的项目中没有任何 slud 字段,但错误仍然存​​在,...仔细查看我发现的模型...它解决了我的问题
      【解决方案3】:

      我敢打赌你有一个没有长度设置的models.SlugField。默认长度为50 characters,很可能对于您的用例来说还不够。

      将其更改为 models.SlugField(max_length=255) 并迁移您的数据库架构。

      【讨论】:

      • 你明白了。我不认为这是问题所在,因为默认情况下 Django 将它们存储为变量(50),但项目中的一个依赖项具有用于 slug 字段的模型变量(100);我忽略了它。
      • @michael 这令人印象深刻。我被卡住了。
      • 那么像slug = models.SlugField(max_length=255),然后迁移到heroku上?
      • 是的,然后运行./manage.py makemigrations && ./manage.py migrate
      • 在我的情况下,它是一个最大长度设置为 10 的 CharField。...我将其更改为 TextField,它运行顺利...
      【解决方案4】:

      model.py 中的预定义字段会产生问题。将其延长到所需的长度,我认为问题将得到解决。

      【讨论】:

        【解决方案5】:

        我遇到了同样的错误。当我在模型中进行更改时,我一直有同样的错误。

        这是我修复它的方法。 程序可能需要跳过一些迁移,以仅使用对 CharField max_lenght 进行了更改的迁移。

        为此你必须运行

        python manage.py showmigrations 
        

        查看哪些迁移尚未进行。

        然后你跳过它们直到你用命令到达最后一个

        python manage.py migrate <app> 000_migration_number --fake 
        

        【讨论】:

          【解决方案6】:

          首先,尝试在模型中的所有适用字段类型上将 max_length 设置为合理的值。

          例如:MyText = models.CharField(max_length=2000)

          如果您没有设置 max_length,您的数据库可能会应用默认的 max_length,比输入数据的长度短,从而导致您的 value too long for type character 错误。

          如果这不起作用并且您从 SQLite 开始并将数据库更改为 PostgreSQL,则以前从 SQLite 的迁移可能会干扰新的 PostgreSQL 迁移。

          进入项目的迁移文件夹并删除旧的迁移文件以重新开始。然后尝试 makemigrations 并再次迁移:)

          【讨论】:

          • 嗨安娜莱丝!感谢您的评论。我认为迁移不依赖于特定的数据库引擎。你有例子吗??无论哪种方式,您现在的评论都没有回答这个特定问题
          • 感谢您的反馈!我不相信迁移应该依赖于数据库。但是,尽管为所有字段设置了 max_length,但我遇到了与原始海报相同的错误。唯一有效的操作是删除以前的迁移并重新开始。我将编辑我的帖子以更好地回答问题。
          【解决方案7】:

          Django 2.1

          我在从 sqlite3 切换到 postgresql 时遇到了这个问题。 删除除 __init__.py 之外的每个应用的迁移文件夹中的迁移文件 然后重新运行迁移

          (venv)myapp$python manage.py makemigrations
          (venv)myapp$python manage.py migrate
          (venv)myapp$python manage.py runserver
          

          【讨论】:

          • 它没有帮助我,迁移的创建不依赖于数据库。
          【解决方案8】:

          如果不是SlugFieldFileField 或此处提到的任何其他字段--滚动回迁移卡在终端中的位置。对我来说是AddField

          说得好。

          【讨论】:

            【解决方案9】:

            Michael Samoylov 的回答为我指明了正确的方向。我遇到了同样的错误,除了 FileField。

            字段有一个 max_length,即使您没有明确设置 max_length。增加该值以使您的数据适合以避免错误。

            就我而言,数据太大而无法合理地存储在数据库中。我将文件保存到磁盘,然后将文件路径保存在数据库中。

            【讨论】:

            • 是的,我认为 Django 应该默认使用最大 SQL 大小而不是假设什么是安全大小,并让用户通过在他们的字段中添加 max_length 来覆盖默认值。跨度>
            【解决方案10】:

            我在 django-autoslugfield 上遇到了类似的问题 我正在使用类似的包,然后切换到 django-autoslugfield

            我收到此错误: value too long for type character varying(50)

            尽管我的 models.py 有:

            slug = AutoSlugField(max_length=255, populate_from='name', unique=True)

            在我的数据库中,它的类型是 character varying 255

            一旦我从字段中删除max_length=255,即

            slug = AutoSlugField(populate_from='name', unique=True)

            然后就正常了

            【讨论】:

            • 对我来说也是如此。但是当我删除 max_length 时,它不会改变任何东西。我得到同样的错误:对于类型字符变化(50)的值太长。当我切换到 django 自己的 slugField 时,它可以使用 max_length 属性。
            【解决方案11】:

            我意识到这个问题已经得到解答,但是对于其他在寻找错误消息时来到这里的人:

            就我而言,问题是我的表名超过了 50 个字符。显然这是不允许的。更改表名解决了这个问题。

            在此处阅读更多信息:https://code.djangoproject.com/ticket/18959

            【讨论】:

              【解决方案12】:

              我在使用文件字段时也遇到了这个问题,我摸不着头脑。当然,默认 FileField 实例的创建限制为 100 个字符。

              https://docs.djangoproject.com/en/dev/ref/models/fields/#filefield

              【讨论】:

              • 对于那些使用长路径的 FileField(例如非常长的文件名或路径)的人,这可能是问题而不是 SlugField。 CMIIW。
              【解决方案13】:

              这是来自 Postgres 而不是 django 的错误消息。

              您似乎更改了models.py 中字段的长度,但这并没有更改您执行manage.py syncdb 时创建的数据库长度。

              您必须直接更改数据库中字段的长度。

              【讨论】:

              • 我没有只在模型中更改它们。当我们更改数据库属性并且我们已经迁移之后,我像往常一样向南跑,我们在 postgres 中手动仔细检查了所有表,并且在任何地方都没有变化 100 的残余。我很困惑。
              猜你喜欢
              • 2020-01-18
              • 2012-11-24
              • 2011-12-06
              • 2020-04-04
              • 2012-10-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-23
              相关资源
              最近更新 更多