Отмена миграции для дублирующегося поля
У нас в модели Django Wagtail было добавлено дублирующее поле, которое запутало систему миграции.
Некоторое время назад в одну из моделей было добавлено следующее, вместе с миграцией, которая добавила единичный экземпляр поля:
stream = fields.StreamField(
who_fund_blocks,
blank=True,
verbose_name="Additional content",
)
stream = fields.StreamField(
who_fund_blocks,
blank=True,
verbose_name="Additional content",
)
Все было в порядке, и проект продолжил работу, добавляя новые поля и миграции в другие места без каких-либо проблем.
Затем дублирующее поле было замечено и удалено со страницы моделей.
Теперь, если мы попытаемся добавить поле в некоторую модель и миграцию для нее, миграция создается, но не завершается, хотя нет никаких ошибок, прямо указывающих на неудачу:
(.venv) development ➜ app 🐟 manpy migrate
/root/.cache/pypoetry/virtualenvs/.venv/lib/python3.10/site-packages/wagtail/utils/widgets.py:10: RemovedInWagtail70Warning: The usage of `WidgetWithScript` hook is deprecated. Use external scripts instead.
warn(
System check identified some issues:
WARNINGS:
?: (urls.W005) URL namespace 'freetag_chooser' isn't unique. You may not be able to reverse all URLs in this namespace
?: (urls.W005) URL namespace 'pagetag_chooser' isn't unique. You may not be able to reverse all URLs in this namespace
?: (urls.W005) URL namespace 'sectiontag_chooser' isn't unique. You may not be able to reverse all URLs in this namespace
Operations to perform:
Apply all migrations: admin, auth, contenttypes, core, csp, django_cron, donations, importers, sessions, submissions, taggit, taxonomy, users, wagtail_localize, wagtailadmin, wagtailcore, wagtaildocs, wagtailembeds, wagtailforms, wagtailimages, wagtailredirects, wagtailsearch, wagtailsearchpromotions, wagtailusers
Running migrations:
Applying core.0019_utilitypage_show_navigation_bar_and_more...
То же самое происходит, если мы добавляем дублирующее поле stream
обратно и создаем новую миграцию, т.е. миграция выглядит так, как будто она работает нормально, но нет подтверждающей галочки.
А когда я запускаю сервер, мы получаем:
You have 1 unapplied migration(s). Your project may not work properly until you apply the migration for app(s): core.
Run 'python manage.py migrate' to apply them.
В базе данных, похоже, уже есть это поле, но система миграции хочет попытаться добавить его снова, но не может, и это блокирует все другие миграции.
Если я закомментирую оба поля stream
, миграции могут быть сделаны, но сайт ломается на странице, где база данных ожидает присутствия поля stream
. Полагаю, я могу удалить поля stream
и вручную добавить поле stream
в базу данных, но при этом мы потеряем часть данных, и я бы предпочел исправить это с помощью Django и миграций.
Есть идеи, как это распутать?
Трудно дать совет, не видя ваших файлов миграции и базы данных. Похоже, что в вашей таблице базы данных есть только одна копия stream
, верно? Поэтому, как только вы удалите дублирование в файле модели, таблица базы данных и ваша питоновская модель будут совпадать.
Предполагая, что это ваша ситуация, я бы отредактировал ваши старые файлы миграции, чтобы удалить упоминание о дубликате. Затем попробуйте запустить migrate
и makemigrations
+ migrate
на копии вашей рабочей базы данных, пока не убедитесь, что все работает так, как вы хотите.
Если в вашей таблице есть дублирующиеся столбцы, мой первый вопрос - как это могло произойти, а второй - какую базу данных вы используете? Я почти уверен, что в базе данных не может быть дублирующихся столбцов, но если это так, то это будет более долгий разговор.