DatabaseError:类型字符变化的值太长(100)
Posted
技术标签:
【中文标题】DatabaseError:类型字符变化的值太长(100)【英文标题】:DatabaseError: value too long for type character varying(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
有人知道这个问题的解决方法吗?
【问题讨论】:
【参考方案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】:如果不是SlugField
、FileField
或此处提到的任何其他字段--滚动回迁移卡在终端中的位置。对我来说是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 的残余。我很困惑。以上是关于DatabaseError:类型字符变化的值太长(100)的主要内容,如果未能解决你的问题,请参考以下文章
Django psycopg2.errors.StringDataRightTruncation:对于类型字符变化的值太长(200)
org.postgresql.util.PSQLException:错误:对于类型字符变化的值太长(255)
Python Django psycopg2.errors.StringDataRightTruncation:类型字符的值太长