Mysql 运行显式创建表的迁移时未创建Django表。

Mysql 运行显式创建表的迁移时未创建Django表。,mysql,django,database,django-migrations,Mysql,Django,Database,Django Migrations,在尝试对Django模型进行一些重大更改时,我把一切都搞砸了。幸运的是,我没有提交任何更改,所以我放弃了所有更改。下一步是让我的数据库恢复到以前的状态。最终,我成功地运行了makemigrations和migrate命令。但是,每当我尝试访问该站点时,我都会收到编程错误,表示我的表topspots\u通知不存在 我的migrations文件夹中有以下迁移文件: # -*- coding: utf-8 -*- # Generated by Django 1.9.6 on 2016-08-25 15

在尝试对Django模型进行一些重大更改时,我把一切都搞砸了。幸运的是,我没有提交任何更改,所以我放弃了所有更改。下一步是让我的数据库恢复到以前的状态。最终,我成功地运行了
makemigrations
migrate
命令。但是,每当我尝试访问该站点时,我都会收到
编程错误
,表示我的表
topspots\u通知
不存在

我的
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)),
            ],
        ),
    ]
它应该创建那个表。如果我特别尝试运行此迁移,它将在尝试取消应用引用该表的后续迁移时失败,因为该表不存在。我已经尝试过删除上面的迁移(创建我的
通知
表的地方),以及之后的每个模型。然后我再次运行
makemigrations
migrate
,但它说没有要应用的迁移,而且我的表还没有创建

我的问题是:为什么在运行迁移时没有创建表?我知道我可以在MySQL中手动创建表,但我想知道我是怎么做的,这样会弄乱数据库的

我看到过很多关于表没有被创建和迁移没有被应用的帖子,但是我还没有找到任何适合我的

  • 我的表不是“非托管”表
  • 我已尝试删除所有迁移并生成新迁移
  • 我尝试过为整个项目运行
    migrate
    ,也尝试过为特定的应用程序甚至特定的迁移运行迁移
我的假设是,在我的数据库中有某种东西告诉Django不要应用迁移,但我不知道该寻找什么


如有任何建议,将不胜感激。谢谢。

当您成功运行迁移时,django会将该迁移的日志存储在
django_migrations
表中(您可以直接在数据库中进行检查),因此下次尝试运行同一迁移时,django会在日志中看到您已经运行了一次,并且不会再次尝试创建该表

您可以尝试通过修改该表来清除应用的迁移,然后再次运行迁移,或者[推荐]使用
--false返回到安全点:

假设您在迁移0003和0002时遇到问题,但迁移0001没有问题。。。那么,回到迁移0001,我们该怎么办

./manage.py migrate my_app 0001 --fake
它将删除
django_migrations
表上的0002和0003迁移,您可以重新创建它们或再次运行新迁移

请在测试之前备份数据库:p不想对任何数据丢失负责XD


希望这有帮助

python manage.py showmigrations显示了什么?它是否将此迁移标记为已应用?@knbk如果
[X]
表示已应用,则是,它将所有迁移显示为已应用。有一个表django_migrations,它保存所有已应用迁移的历史记录。您可以试试看。@user2976657谢谢您的建议!看到被接受的答案,原来它与那张桌子有关。很漂亮。是的,这就成功了。我之前看到,
django_migrations
表中有迁移记录,我在恢复实验性更改时已经删除了这些记录,但不知道如何处理它们,然后就忘记了它们。感谢您对该表如何工作以及如何解决问题的简单解释!