Как работать с `отношением" cms_disclaimerpanel "уже существует" и ProgrammingError: столбец "http_request_lang" отношения "xyz" не существует - PullRequest
2 голосов
/ 24 мая 2019

У меня довольно раздражающая проблема при попытке отправить мое слияние в мои автоматические тесты на круге CI.

Просто для контекста, я унаследовал проект, авторы которого больше не работают над моим текущимработа.

Я работаю над django, и я выполнил слияние от моей локальной ветки разработчика до моей локальной ветки master.Слияние прошло хорошо.Однако при запуске сервера django через manage.py runserver выдается предупреждение Your project may not work properly until you apply the migrations for app(s)[...].

При выполнении manage.py migrate я сталкиваюсь с первой проблемой:

1- django.db.utils.ProgrammingError: relation "cms_disclaimerpanel" already exists

Я исправляю проблему, вручную редактируя файл переноса, комментируя следующие строки

 #       migrations.CreateModel(
 #           name='DisclaimerPanel',
 #           fields=[
 #               ('abstractpanel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.AbstractPanel')),
 #               ('title', models.CharField(blank=True, max_length=1024, verbose_name='title')),
 #               ('show_title', models.BooleanField(default=True, verbose_name='show title')),
 #               ('subtitle', models.TextField(blank=True, verbose_name='content')),
 #               ('show_subtitle', models.BooleanField(default=True, verbose_name='show subtitle')),
 #               ('alignment', models.CharField(choices=[('left', 'left'), ('center', 'center')], default='center', max_length=10, verbose_name='text alignment')),
 #               ('button', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cms.Link')),
 #           ],
 #           options={
 #               'verbose_name': 'Disclaimer Panel',
 #           },
 #           bases=('cms.abstractpanel',),
 #       )

Затем возникла вторая проблема при переносе моего manage.py migrate

2 - ProgrammingError: column "http_request_lang" of relation "cms_dynamicsettings" does not exist

Я исправляю проблему, вручную редактируя файл миграции, комментируя следующие строки

#operations = [
#    migrations.RemoveField(
#        model_name='dynamicsettings',
#        name='http_request_lang',
#    ),
#]

manage.py удалось выполнить полностью.Затем я запустил manage.py makemigrations, и он дал мне этот последний файл

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        ('cms', '0088_merge_20190411_1655'),
    ]

    operations = [
        migrations.CreateModel(
            name='DisclaimerPanel',
            fields=[
                ('abstractpanel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.AbstractPanel')),
                ('title', models.CharField(blank=True, max_length=1024, verbose_name='title')),
                ('show_title', models.BooleanField(default=True, verbose_name='show title')),
                ('subtitle', models.TextField(blank=True, verbose_name='content')),
                ('show_subtitle', models.BooleanField(default=True, verbose_name='show subtitle')),
                ('alignment', models.CharField(choices=[('left', 'left'), ('center', 'center')], default='center', max_length=10, verbose_name='text alignment')),
                ('button', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cms.Link')),
            ],
            options={
                'verbose_name': 'Disclaimer Panel',
            },
            bases=('cms.abstractpanel',),
        ),
        migrations.RemoveField(
            model_name='dynamicsettings',
            name='http_request_lang',
        ),
    ]

С изменениями выше, я могу запустить manage.py runserver.

Затем я добавляю эти 3 файла в свойобъедините ветку и создайте удаленный репозиторий для моей ветки.

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

Это дает мне следующую ошибку, ту же ошибкукак в пункте 2 (см. выше).

ERROR:  relation "cms_dynamicsettings" does not exist at character 1508

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

Вопросы следующие:

  • Есть ли способ отбросить мою модель cms_disclaimer до ее запуска через этот чертов файл миграции?Если да, то как?

  • Есть ли способ не принимать во внимание файл миграции и указывать ему не удалять столбец http_request_lang

  • Мой последний вопрос: почему manage.py makemigrations не видит изменений в базе данных?

Еще одна информация:

База данных была построена с мастером ветвления,Я проверяю другую ветку на основе master, объединяю свою ветку dev с master и затем manage.py migrate.

Любая информация будет более чем приветствоваться, так как я теряю рассудок.

Спасибо.

1 Ответ

1 голос
/ 24 мая 2019

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

  1. Проверьте в своей производственной базе данных таблицу "django_migrations" и посмотрите последнюю миграцию, которая была применена для каждого из ваших приложений.
  2. В своем коде удалите все файлы миграции, которые были добавлены после этой последней миграции.Сделайте это для каждого приложения.Убедитесь, что все файлы миграции, примененные к вашей базе данных, присутствуют в вашем репозитории.
  3. Запустите manage.py migrate, что ничего не должно делать («ничего не переносить»), если ваши файлы миграции синхронизируются с вашей базой данных.
  4. Запустите manage.py makemigrations, который создаст один дополнительный файл миграции, который отражает все изменения в ваших моделях относительно вашей базы данных.
  5. Запустите manage.py migrate и все должно работать.

Некоторые вещи, о которых следует беспокоиться при этом:

  • Убедитесь, что все базы данных, которые вы используете (во всех средах), синхронизированы с производственной базой данных.
  • Убедитесь, что никто не работает в другой ветке, где могут существовать другие миграции.
...