Ошибка при работе с двумя базами данных в Django: sqlite3.IntegrityError: NOT NULL constraint failed: wagtailcore_page.draft_title
Я работаю над проектом Django с Wagtail, который использует две базы данных. Первая - стандартная база данных sql lite для всех моделей django (называется db_tool.sqlite3
), вторая - тоже sql lite, но для интеграции с Wagtail (называется db.sqlite3
).
Я хотел перейти на db_tool.sqlite3
с помощью следующей команды
python manage.py make migrations
python manage.py migrate --database db_tool
но теперь я получаю следующее сообщение об ошибке относительно трясогузки, которое я никогда не получал раньше.
django.db.utils.IntegrityError: NOT NULL constraint failed: wagtailcore_page.draft_title
Прежде всего: я не понимаю этого, потому что я назвал db_tool в частности, и мне интересно, почему интеграция wagtail вызывает ошибку, когда я пытаюсь мигрировать на db_tool.
Второе: я не вижу никакого конкретного поля на моих wagtail-страницах под названием draft_title
и у меня нет никакой черновой страницы на данный момент.
Третье: сообщение об ошибке также относится к файлу миграции wagtail, который можно найти в побочных пакетах (см. ниже). Так что, возможно, это корень ошибки, но я не понимаю, как это связано с другим сообщением об ошибке, потому что с тех пор все работало нормально, и я ничего не менял, кроме некоторого содержимого моих страниц трясогузки.
File "C:\Users\pubr\.conda\envs\iqps_web\lib\site-packages\wagtail\core\migrations\0001_squashed_0016_change_page_url_path_to_text_field.py", line 23, in initial_data
root = Page.objects.create(
Версия трясогузки, которую я использую здесь - wagtail 2.15.2
, и я не обновлял ее с тех пор, как начал проект...
В связи с тем, что моя база данных wagtail имеет имя базы данных по умолчанию django-database, возможно ли, что я случайно попробовал миграцию, которая была предназначена для tool_db.sqlite3
, не назвав ее в migrate
-команде и вызвал этим ошибку?
Поэтому я буду очень благодарен, если кто-нибудь знает, откуда берется эта ошибка, или хотя бы, что я могу попробовать, чтобы исправить ее...
Добрые пожелания и благодарность!
если при работе с двумя базами данных в Django вы получаете ошибку sqlite3.IntegrityError: NOT NULL constraint failed: wagtailcore_page.draft_title
, это означает, что в колонку NULL
таблицы wagtailcore_page было вставлено значение draft_title
, но эта колонка не допускает значений NULL
.
Чтобы исправить эту ошибку, необходимо убедиться, что в столбец NULL
для всех строк таблицы draft_title
вставлено неwagtailcore_page
значение. Это можно сделать, задав значение по умолчанию для столбца в определении модели или вручную обновив существующие строки в таблице.
from django.db import models
class Page(models.Model):
# Other fields...
draft_title = models.CharField(max_length=255, default='Untitled')
вы можете обновить существующие строки в таблице wagtailcore_page
, чтобы установить неNULL
значение для столбца draft_title
.
Мне неясно, нарушена ли ваша база данных в настоящее время или нет. Надеюсь, что нет, но если это так, пожалуйста, сделайте резервную копию каждой из них, прежде чем делать что-либо еще.
Похоже, что вы пытаетесь работать не с той базой данных. Настроены ли у вас DATABASE_ROUTERS? Я думаю, это может помочь вам предотвратить внедрение кода из одного приложения в неправильную базу данных. Пример в документации Django в основном ориентирован на чтение реплик, но должен быть адаптирован к вашей ситуации: https://docs.djangoproject.com/en/4.1/topics/db/multi-db/#an-example
Если ваши базы данных находятся в неправильном состоянии, начните с просмотра файла django_migrations в каждой из них, а затем тщательно обрезайте испорченную, пока не вернетесь к разделению, которое вы обеспечивали.