Makemigrations приводит к django.db.utils.OperationalError: no such column: (Python 3.10 и Django 4.0.3)

Во-первых, и это действительно важно, эта ошибка возвращается, КОГДА я запускаю python manage.py makemigrations (Python 3.10 и Django 4.0.3)

В моем исследовании многих случаев этой ошибки я видел это как первое предложение для этого конкретного сообщения об ошибке. Повторяю, эта проблема НЕ будет решена с помощью ответа, просто выполните python manage.py makemigrations

При добавлении нового поля и запуске makemigrations я получаю следующую ошибку:

django.db.utils.OperationalError: no such column: events_eventsetting.timezone_aware_venues

OK, теперь немного дополнительных деталей. Это не первый мой проект на Django. Я создал несколько надежных приложений и очень хорошо разбираюсь в добавлении полей в модели. Много, много раз я делал следующее без проблем... до тех пор, пока несколько дней назад

  • Добавьте новое синтаксически корректное поле
  • запустить python manage.py makemigrations
  • запустить python manage.py migrate

И все шло очень хорошо до пары дней назад. Для дополнительного контекста, я никак не менял виртуальную среду - файл requirements.txt имеет точно такое же содержимое. Я также не добавлял никаких приложений и не вносил никаких изменений в файл settings.py. Кроме того, я не делал никаких ссылок на это поле в других местах. Добавление этого поля в модель в обоих случаях было самой первой ссылкой на поле.

Другими словами, я понимаю, что пока поле не перенесено в БД, нет смысла ссылаться на него. И кроме того, PyCharm начнет шуметь, когда вы попытаетесь сделать это в любом случае.

При работе над проектом с примерно 10 таблицами и более чем 200 столбцами по всей БД несколько дней назад я получил следующую ошибку при запуске makemigrations:

Учитывая ссылку на ряд библиотек, вот файл requirements.txt, неизменный между двумя последними успешными makemigration и этим выпуском:

asgiref==3.5.0
Babel==2.9.1
beautifulsoup4==4.10.0
crispy-bootstrap5==0.6
Django==4.0.3
django-bootstrap-datepicker-plus==4.0.0
django-bootstrap4==22.1
django-crispy-forms==1.14.0
django-money==2.1.1
django-phone-field==1.8.1
py-moneyed==1.2
python-dateutil==2.8.2
pytz==2022.1
soupsieve==2.3.1
sqlparse==0.4.2
stripe~=2.70.0
twilio~=7.8.0
tzdata==2022.1

И вот, немного осмотревшись, я пришел в недоумение. Почему операция, предназначенная для подготовки SQL для миграции БД, говорит мне, что такого столбца нет? Мой первый раунд исследований не дал никакого решения.

После долгого копания в этом я решил полностью переделать проект. Не будучи специалистом по SQL и не сумев решить проблему удалением всех файлов миграции и файла db.sqlite3, я просто переделал проект с нуля, скопировав/вставив множество файлов (в свежую папку и новый git-репозиторий).

Переходим на день позже. Добавление нового поля ломает уже работающий проект... ВНОВЬ! Проект отлично работает, БД подключена, я могу использовать каждое приложение в проекте и проверять различными тестами, что все в порядке.

Теперь о некоторых особенностях проекта. Вот рассматриваемая модель из файла models.py.

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

Обратите внимание, что до этого момента перестройка проходила идеально. Единственные изменения, которые я внес, касались представления и шаблона.

Однако, когда я пошел добавить следующее в models.py:

    timezone_aware_venues = models.CharField(
        choices=YES_NO_CHOICES,
        max_length=5,
        default='Yes',
    )

Я получил ту же ошибку.

Какие другие способы устранения неполадок я пробовал?

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

Я удалил все __pycache__ файлы.

Я вручную создал файл миграций:

pyfrom django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('events', '0002_alter_event_event_cost_currency_and_more'),
    ]

    operations = [
        migrations.AddField(
            model_name='event',
            name='timezone_aware_venues',
            field=models.CharField(blank=True, choices=[('Yes', 'Yes'), ('No', 'No')], default='Yes', max_length=10, null=True),
        ),
    ]

Выше приведена ТОЧНО такая же ошибка.

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

Что ломает мне голову над этим, так это то, что makemigrations создан для создания файла миграции для SQL, который должен быть построен.

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

Это все на новом проекте, созданном всего пару дней назад. Я могу доказать, что синтаксис не является причиной. Код правильный, и я могу доказать это, потому что я могу скопировать/вставить всю модель с полем, вызывающим ошибку, в совершенно новую модель и НЕ получить эту ошибку.

Если это проблема подключения к БД, то я в недоумении. Проект отлично работает на фронт-энде. Если есть проблема с кодировкой, я в недоумении. Я могу создать совершенно новую модель с новым именем, использовать все существующие поля, а новое поле, которое я пытаюсь добавить, и makemigrations работают идеально!

Я могу обойти это, пересоздав проект заново, с нуля. Я сделал это два дня назад, на совершенно новом git-репозитории, в совершенно свежей папке, с совершенно новым venv.

КАК БЫ то ни было, это обходной путь. Он не является причиной. Это мой наименее любимый вариант. Я не знаю, что является причиной этой проблемы, и могу только предположить, что это может произойти снова. В конце концов, это уже второй проект, в котором это произошло за последние несколько дней.

Если я не смогу преодолеть это, у меня не останется выбора. Мне просто придется переделать проект с нуля, снова добавить поля, и все. В прошлый раз я попытался удалить все файлы миграции и файл db.sqlite3, запустить makemigrations для восстановления БД и снова получил ту же ошибку. Самое быстрое решение, хоть и многочасовое, это буквально начать все заново, пока не появится эта ошибка.

И вот, полагая, что вы можете доверять тому, что я точно представляю эту ситуацию, что я действительно знаю, как правильно добавить поле в модель Django, что я просмотрел более 40+ вопросов на Stack Overflow по этому поводу, чтобы обнаружить несколько похожих вопросов без ответов, я решил опубликовать еще один.

В этом случае что-то не так во фреймворке Django. makemigrations предназначен для написания файла, который обновляет SQL-базу данных. Ошибка выглядит иррациональной, учитывая контекст. А обходной путь в виде необходимости перезапускать проекты с нуля, с большим количеством копирования/вставки, чтобы продемонстрировать, что мой код был правильным все это время, указывает на то, что это произошло не по моей вине. Я полностью ожидаю, что вернусь к этому сообщению через день или два с правкой, говорящей: "Ага, я снова перестроил проект с нуля, и это поле было добавлено без проблем при переносе базы данных."

Учитывая количество похожих вопросов без ответов, я не ожидаю ответа "серебряной пули". Но есть ли среди вас эксперты по Django и db, которые могут указать мне путь устранения неполадок, состоящий из советов более сложных, чем выполнение python manage.py makemigrations?

Вернуться на верх