Django: преобразование CharField в TextField с сохранением данных - PullRequest
12 голосов
/ 03 мая 2011

Есть ли способ изменить CharField на TextField и сохранить данные из этого столбца нетронутыми?

Сейчас у меня есть следующее:

class TestLog(models.Model):
    failed_reqs = models.CharField(max_length=DB_MAX_CHAR_LENGTH, blank=True)
    passed_reqs = models.CharField(max_length=DB_MAX_CHAR_LENGTH, blank=True)

Но DB_MAX_CHAR_LENGTH равно 500, и, как выясняется, иногда это поле может превышать это значение, поэтому я хочу перейти к:

class TestLog(models.Model):
    failed_reqs = models.TextField(blank=True)
    passed_reqs = models.TextField(blank=True)

Как мне это сделать и сохранить мои данные в производственной базе данных без изменений?

Djangobook подробно описывает, как добавлять и удалять поля, и я также пытался использовать Юг, чтобы сделать это, но Юг дал мне ошибку, и посмотрел на вывод до того, как ошибка выглядит как хотя Юг сбрасывает и воссоздает БД. Это то, что юг миграция данных это все о

Ответы [ 3 ]

12 голосов
/ 02 февраля 2016

Это решается с помощью миграций django (1.7+).Если вы измените тип с CharField на TextField, произойдет миграция AlterField, которая делает все правильно.

5 голосов
/ 03 мая 2011

Предполагая, что у вас есть доступ к базе данных, поскольку вы упомянули, как Django говорит о добавлении и удалении столбцов, я перечислил методы для Postgresql и MySQL, поскольку вы не упомянули, что вы использовали.

Postgresql:
BEGIN;
    ALTER TABLE "TestLog"
        ALTER COLUMN "failed_reqs" TYPE TEXT,
        ALTER COLUMN "passed_reqs" TYPE TEXT;
COMMIT;

MySQL:
BEGIN;
    ALTER TABLE TestLog
        MODIFY failed_reqs TEXT NULL,
        MODIFY passed_reqs TEXT NULL;
COMMIT;

Я бы настоятельно рекомендовал сделать резервную копию вашей базы данных перед внесением этих изменений.

5 голосов
/ 03 мая 2011

От руки, я бы продолжал смотреть на южный подход.Это рабочий процесс, который я бы попробовал:

1) Миграция схемы на юг для создания двух новых полей TextField, которые называются что-то вроде «failed_reqs_txt» и «sent_reqs_txt».

2) Создайте миграцию данных для переноса данных из старых полей в новые поля

3) Создайте миграцию схемы, чтобы удалить исходные поля «failed_reqs» и «sent_reqs».

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

4) Создайте миграцию схемы, добавив "failed_reqs" и "прошло_reqs "как TextFields

5) Создайте миграцию данных для переноса из полей« failed_reqs_txt »и« sent_reqs_txt »в поля« failed_reqs »и« sent_reqs ».

6) Создание схемымиграция для удаления полей «failed_reqs_txt» и «sent_reqs_txt».

Хотя это много миграций, оно разбивает каждое изменение на атомные миграции.Я бы попробовал это первым.Я не уверен, почему Саут бросит и воссоздает БД.Вы запускали опцию convert_to_south при добавлении юга в ваш проект?Я думаю, что это подделывает миграцию и позволяет югу знать, что он работает с существующим проектом, а не с новым.

В качестве альтернативы, вы можете сделать несколько прямых ALTERS для базы данных, чтобы изменить тип столбца, а затем обновить model.py из CharField в TextField. Postgres , предположительно, поддерживает неявное изменение типов данных таким образом.(См. Раздел 5.5.6.) Я не уверен насчет mysql, но думаю, что он работает так же.(CharField в TextFiled должен быть совместимым преобразованием)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...