Почему Django отбрасывает ограничение SQL DEFAULT при добавлении нового столбца? - PullRequest
3 голосов
/ 24 сентября 2019

В последней версии Django (2.2), когда я добавляю новое поле в модель, подобную этой:

new_field= models.BooleanField(default=False)

Django запускает следующие команды для MySQL:

ALTER TABLE `app_mymodel` ADD COLUMN `new_field` bool DEFAULT b'0' NOT NULL;
ALTER TABLE `app_mymodel` ALTER COLUMN `new_field` DROP DEFAULT;
COMMIT;

Покаэто работает, когда все обновляется, это очень проблематично, потому что старые версии приложения больше не могут создавать модели после запуска этой миграции (они не знают о new_field).Почему бы просто не сохранить ограничение DEFAULT?

1 Ответ

2 голосов
/ 27 сентября 2019

Я нашел этот билет 2 года назад: https://code.djangoproject.com/ticket/28000
В нем указано , что:

Django использует базу данных по умолчанию для установки значенийна существующие строки в таблице.Он не оставляет значений по умолчанию в базе данных, поэтому удаление значений по умолчанию является правильным поведением. Может быть оптимизация, чтобы не устанавливать / удалять значения по умолчанию в этом случае - я не уверен, что это необходимо, так как столбец isnне имеет значенияДля этого можно открыть отдельный тикет.

Я также видел ту же ссылку в другом вопросе здесь: Django Postgresql по умолчанию отбрасывает столбец при переносе

И поискнемного больше я натолкнулся на этот вопрос SO: Реализация Django значения по умолчанию в базе данных , которое привело к коду метода _alter_field из django.db.backends.base.schema, где существует этот комментарий:

# When changing a column NULL constraint to NOT NULL with a given
# default value, we need to perform 4 steps:
#  1. Add a default for new incoming writes
#  2. Update existing NULL rows with new default
#  3. Replace NULL constraint with NOT NULL
#  4. Drop the default again.

Хотя последнее относится к изменению существующего поля, допускающего обнуляемость, в ненулевое значение, похоже, именно так Django обрабатывает случай default: /

...