DatabaseError: слишком длинное значение для меняющегося символа типа (100)

У меня есть веб-сайт Django, на котором запущена мини-CMS, которую мы создали внутри компании много лет назад, она использует postgresql. При сохранении простого заголовка и абзаца текста я получаю следующую ошибку:

value too long for type character varying(100)

Странно то, что ни один столбец не меняется (100), все они 200 или 250, даже значения по умолчанию Django были изменены со 100 на 200 из-за повторно открытый билет, упомянутый здесь

Кто-нибудь знает решение этой проблемы?


person tdelam    schedule 27.01.2012    source источник


Ответы (13)


Могу поспорить, что у вас models.SlugField без набора длины. Длина по умолчанию - 50 символов, скорее всего, этого недостаточно. для вашего варианта использования.

Измените его на models.SlugField(max_length=255) и перенесите схему базы данных.

person Michael Samoylov    schedule 27.01.2012
comment
Ты понял. Я не думал, что это проблема, потому что по умолчанию Django хранит их как изменяющиеся (50), но одна из зависимостей в проекте имела изменяющуюся модель (100) для полей заголовка; Я упустил это из виду. - person tdelam; 30.01.2012
comment
@michael, это было впечатляюще. Я очень застрял. - person harristrader; 06.01.2016
comment
Так что вроде slug = models.SlugField (max_length = 255), а затем перейти на heroku? - person Henry Zhu; 24.04.2016
comment
Да, тогда запустите ./manage.py makemigrations && ./manage.py migrate - person Michael Samoylov; 25.04.2016
comment
В моем случае это было CharField с max_length равным 10. ... Я изменил его на TextField, и он работал плавно ... - person elyahu; 30.05.2019
comment
Ты король! Спасибо!!! - person Ulvi; 04.01.2021

У меня также была эта проблема при использовании файлового поля, и я некоторое время чесал голову. Конечно, экземпляры FileField по умолчанию создаются с ограничением в 100 символов.

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

person Kerridge0    schedule 22.04.2013
comment
для тех, кто работает с длинным путем к FileField (например, с очень длинным именем файла или путем), это может быть проблемой, а не SlugField. CMIIW. - person rahmatns; 23.07.2020

Это сообщение об ошибке от Postgres, а не от django.

Кажется, вы изменили длину поля в models.py, но это не меняет длину базы данных, которая была создана, когда вы выполнили manage.py syncdb.

Вы должны напрямую изменить длину поля в базе данных.

person lprsd    schedule 27.01.2012
comment
Я не менял их только в моделях. Я побежал на юг, как обычно, когда мы изменили свойства БД и с тех пор мигрировали, мы дважды проверили все таблицы вручную в postgres, и нигде не осталось остатков от 100. Я смущен. - person tdelam; 27.01.2012

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
person 7guyo    schedule 31.12.2018
comment
мне это не помогло, создание миграции не зависит от базы данных. - person Alex78191; 18.12.2019

У меня была аналогичная проблема с 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)

тогда это сработало нормально

person lukeaus    schedule 08.08.2015
comment
То же было и со мной. Но когда я удаляю max_length, это ничего не меняет. Я получаю ту же ошибку: слишком длинное значение для меняющегося символа типа (50). Когда я переключаюсь на собственный slugField django, он работает с атрибутом max_length. - person Ulvi; 06.01.2021

Ответ Михаила Самойлова указал мне правильное направление. У меня возникла такая же ошибка, за исключением того, что это было с FileField.

Поля имеют max_length, даже если вы явно не установили max_length. Увеличьте значение, чтобы ваши данные подходили, чтобы избежать ошибки.

В моем случае данные были слишком большими, чтобы их можно было хранить в базе данных. Я прибег к тому, чтобы сохранить свой файл на диск, а затем сохранить путь к файлу в базе данных.

person Shaun Overton    schedule 11.01.2017
comment
да, я думаю, что Django по умолчанию должен использовать максимальный размер SQL вместо того, чтобы делать предположения о безопасном размере, и позволять пользователю переопределять значение по умолчанию, добавляя вместо этого max_length в свое поле. - person tdelam; 13.08.2018

я прошел через ту же ошибку. и когда я внес изменения в модель, у меня продолжалась та же ошибка.

Вот как я это исправил. Возможно, потребуется пропустить несколько миграций, чтобы программа использовала только миграцию, в которой были внесены изменения для CharField max_lenght.

для этого вам нужно бежать

python manage.py showmigrations 

чтобы увидеть, какие миграции не были выполнены.

затем вы пропускаете их, пока не дойдете до последнего с помощью команды

python manage.py migrate <app> 000_migration_number --fake 
person Romain BOBOE    schedule 04.06.2020

Я понимаю, что на этот вопрос уже дан ответ, но для других, которые приходят сюда в поисках сообщения об ошибке:

В моем случае проблема заключалась в том, что имя моей таблицы превышало 50 символов. Видимо это недопустимо. Изменение имени таблицы решило проблему.

Подробнее читайте здесь: https://code.djangoproject.com/ticket/18959

person Ramon de Jesus    schedule 01.09.2014

Если это не SlugField, FileField или любое другое поле, упомянутое здесь - прокрутите назад до места, где миграция застряла в терминале. Для меня это было AddField

Хорошая беседа.

person Poopy McFartnoise    schedule 16.10.2018

Во-первых, попробуйте установить для max_length какое-нибудь разумное значение для всех применимых типов полей в вашей модели.

Например: MyText = models.CharField(max_length=2000)

Если вы не устанавливаете max_length, ваша база данных может применять max_length по умолчанию, меньшую, чем длина ваших входных данных, что вызывает ошибку value too long for type character.

Если это не сработает и вы начали с SQLite и изменили базы данных на PostgreSQL, предыдущие миграции с SQLite могут мешать новым миграциям PostgreSQL.

Перейдите в папку миграции вашего проекта и удалите старые файлы миграции, чтобы начать все сначала. Затем попробуйте makemigrations и снова выполните миграцию :)

person Annaleise    schedule 27.03.2020
comment
Привет, Анналейз! Спасибо за комментарий. Я думаю, что миграции не зависят от конкретного движка базы данных. У вас есть пример ?? В любом случае, ваш комментарий в его нынешнем виде не отвечает на этот конкретный вопрос. - person pyjavo; 28.03.2020
comment
Спасибо за ваш отзыв! Я не верю, что миграции должны зависеть от базы данных. Однако у меня была та же ошибка, что и у исходного плаката, несмотря на то, что max_length была установлена ​​для всех полей. Единственное действие, которое работает, - это удаление предыдущих миграций и повторный запуск. Отредактирую свой пост, чтобы лучше ответить на вопрос. - person Annaleise; 29.03.2020

предопределенные поля в model.py создают проблему. Увеличьте его до нужной длины, думаю, проблема будет решена.

person Rabeul Hasan    schedule 16.09.2020

Для FileField и ImageField из документации Django:

Экземпляры FileField создаются в вашей базе данных как столбцы varchar с максимальной длиной по умолчанию 100 символов. Как и в случае с другими полями, вы можете изменить максимальную длину с помощью аргумента max_length.

person apet    schedule 15.06.2021

Значение может быть 100, 25 или 17, причина в моделях, найдите, где вы добавили эту длину (17,25), и получите ошибку! ,

Вы пытаетесь установить длину поля больше указанной.

Это решило мою проблему, надеюсь, вам это тоже поможет.

person Saikat Mukherjee    schedule 03.05.2021
comment
Проблема не была связана с этим. По умолчанию максимальная длина пули составляет 50 (или, может быть, была в то время, когда я впервые задал этот вопрос), но длина пули была больше 50, так что это создавало ошибку. Добавление max_length к slugfield устранило проблему - person tdelam; 03.05.2021
comment
Сэр, у меня нет поля slud в моем проекте, но ошибка все еще существует, ... внимательно присмотревшись к модели, я нахожу это ... и это решило мою проблему - person Saikat Mukherjee; 04.05.2021