Таблица Django не создается при выполнении миграций, которые явно создают таблицу.

Экспериментируя с некоторыми серьезными изменениями в моих моделях Django, я серьезно все испортил. К счастью, я не внес никаких изменений, поэтому я сбросил все изменения. Следующим шагом было вернуть мою базу данных в прежнее состояние. В конце концов, я дошел до того, что мог успешно без проблем запускать команды makemigrations и migrate. Однако всякий раз, когда я пытаюсь зайти на сайт, я получаю ProgrammingError сообщение о том, что моя таблица topspots_notification не существует.

У меня в папке migrations есть следующий файл миграции:

# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-08-25 15:52
from __future__ import unicode_literals

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


class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('topspots', '0018_siteuser_share_location'),
    ]

    operations = [
        migrations.CreateModel(
            name='Notification',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('message', models.TextField()),
                ('recipient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recipient_notification', to=settings.AUTH_USER_MODEL)),
                ('sender', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sender_notification', to=settings.AUTH_USER_MODEL)),
            ],
        ),
    ]

Который должен создать эту таблицу. Если я попытаюсь запустить эту миграцию специально, она не удастся отменить последующие миграции, которые ссылаются на эту таблицу, поскольку эта таблица не существует. Я попытался удалить указанную выше миграцию (где создана моя таблица notification) и все модели, которые идут после нее. Затем я снова запускаю makemigrations и migrate, но он говорит, что миграции для применения нет, и моя таблица все еще не создана.

У меня вопрос: почему моя таблица не создается при запуске миграции? Я знаю, что могу вручную создать таблицу в MySQL, но я хотел бы знать, что я сделал не так, чтобы испортить мою базу данных таким образом.

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

  • Моя таблица не является «неуправляемой».
  • Я попытался удалить все свои миграции и создать новые.
  • Я пробовал запускать migrate для всего проекта, а также выполнять миграции для конкретного приложения и даже для определенных миграций.

Я предполагаю, что в самой моей базе данных есть что-то, что говорит Django не применять миграции, но я не знаю, что искать.

Мы ценим любые предложения. Спасибо.


person elethan    schedule 31.08.2016    source источник
comment
Что показывает python manage.py showmigrations? Помечает ли он эту миграцию как примененную?   -  person knbk    schedule 31.08.2016
comment
@knbk Если [X] означает "применено", тогда да, все миграции отображаются как примененные.   -  person elethan    schedule 31.08.2016
comment
Есть таблица django_migrations, в которой хранится история всех примененных миграций. Вы можете попробовать посмотреть на это.   -  person shubham003    schedule 31.08.2016
comment
@ user2976657 спасибо за предложение! См. Принятый ответ, оказывается, он был связан с этой таблицей.   -  person elethan    schedule 31.08.2016


Ответы (1)


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

Вы можете попытаться очистить примененные миграции, изменив эту таблицу, а затем снова запустить миграции ИЛИ [рекомендуется] вернуться в безопасную точку, используя --fake:

предположим, что у вас были проблемы с миграцией 0003 и 0002, но миграция 0001 прошла успешно ... так что, чтобы вернуться к миграции 0001, выполните

./manage.py migrate my_app 0001 --fake

он удалит миграции 0002 и 0003 из таблицы django_migrations, и вы сможете воссоздать их или снова запустить новые миграции.

Пожалуйста, сделайте резервную копию вашей базы данных перед тестированием: P не хочу нести ответственность за любую потерю данных XD

Надеюсь это поможет

person pleasedontbelong    schedule 31.08.2016
comment
Красивый. Да, это сработало. Ранее я видел, что в таблице django_migrations были записи о миграциях, от которых я уже избавился, когда откатил свои экспериментальные изменения, но не знал, что с ними делать, а затем забыл о них. Спасибо за понятное объяснение того, как работает эта таблица и как решить проблему! - person elethan; 31.08.2016