Миграция PositiveIntegerField в FloatField - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть существующая заполненная база данных, и я хотел бы преобразовать PositiveIntegerField в FloatField.Я рассматриваю просто сделать миграцию:

    migrations.AlterField(
        model_name='mymodel',
        name='field_to_convert',
        field=models.FloatField(
            blank=True,
            help_text='my helpful text',
            null=True),
    ),

Где поле в настоящее время определено как:

field_to_convert = models.PositiveIntegerField(
    null=True,
    blank=True,
    help_text='my helpful text')

Требуется ли для этого полная перезапись столбца базы данных?Насколько хорошо это преобразование может масштабироваться для больших баз данных?Как это могло бы масштабироваться, если бы подавляющее большинство значений были null?При каких обстоятельствах это преобразование потерпит неудачу?Это поддерживается базой данных Postgres, если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Для этого потребуется полная перезапись столбца базы данных?

Нет, не будет.Я провел эксперимент с PostgreSQL, MySQL и SQLite, и преобразование целого числа в число с плавающей запятой в каждом случае проходит хорошо. Я также поставил некоторые значения как нулевые, чтобы соответствовать вашей ситуации.

Если у вас есть значение 3, оно просто изменится на 3.0.

Как оно могло бы масштабироваться, если бы подавляющее большинство значений были нулевыми?

Хорошо,так как вы сохраняете null=True в конфигурации вашего поля, все нулевые значения останутся нулевыми, с этим проблем нет.Если вы удалите null=True, вам может потребоваться указать значение default.

При каких обстоятельствах это преобразование завершится неудачей?

Взятие столбца int и преобразование его в число с плавающей точкой (действительное) должноне ошибитесь, если вы найдете странный, странный и очень особенный случай, это будет очень большой вывод.

Если у вас есть сомнения по поводу результата миграции ...

... вы можетеСначала взгляните на миграцию SQL с помощью sqlmigrate , и, конечно, вы можете сделать резервную копию вашей базы данных.

0 голосов
/ 05 февраля 2019

Вы можете использовать sqlmigrate , чтобы проверить сгенерированный sql для вашей миграции.

$ python manage.py sqlmigrate app_label имя_ миграции

Имейте в виду, что его вывод зависит от версии Djangoи база данных у вас в настройках.За настройку, которую я имел под рукой (Django 1.11, Postgres 9.3) для вашей миграции, я получил:

BEGIN;
--
-- Alter field field_to_convert on mymodel
--
ALTER TABLE "myapp_mymodel" DROP CONSTRAINT "myapp_mymodel_field_to_convert_check";
ALTER TABLE "myapp_mymodel" ALTER COLUMN "field_to_convert" TYPE double precision USING "field_to_convert"::double precision;
COMMIT;

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

Если вы хотите быть более безопасным, вы всегда можете пойти: переименовать поле -> создать поле -> запустить python -> удалить поле.Это даст вам больше контроля над процессом миграции.Проверьте этот ответ для деталей.

...