当显式创建 table 的 运行 迁移时未创建 Django table。

Django table not created when running migrations that explicitly create table.

在尝试对我的 Django 模型进行一些重大更改时,我把一切都搞砸了。幸运的是,我没有提交任何更改,所以我放弃了所有更改。下一步是让我的数据库恢复到以前的状态。最终,我达到了可以毫无问题地成功 运行 makemigrationsmigrate 命令的地步。但是,每当我尝试访问该站点时,我都会收到 ProgrammingError 说我的 table 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)),
            ],
        ),
    ]

应该创建 table。如果我专门尝试 运行 此迁移,它将在尝试取消应用以后引用 table 的迁移时失败,因为 table 不存在。我尝试删除上面的迁移(我的 notification table 创建的地方),以及它之后的每个模型。然后我再次 运行 makemigrationsmigrate,但是它说没有要应用的迁移,而且我的 table 仍然没有创建。

我的问题是:为什么我 运行 迁移时没有创建我的 table? 我知道我可以手动创建 table 在 MySQL 中,但我想知道我做错了什么以这种方式弄乱了我的数据库。

我已经看到许多与 table 未创建和未应用迁移相关的 SO 帖子,但我还没有找到适合我的内容。

我的假设是我的数据库本身有一些东西告诉 Django 不要应用迁移,但我不知道要寻找什么。

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

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

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

假设您在迁移 0003 和 0002 时遇到问题,但迁移 0001 没问题...所以回到迁移 0001 做

./manage.py migrate my_app 0001 --fake

它将删除 django_migrations table 上的 0002 和 0003 迁移,您将能够重新创建它们或再次 运行 新迁移

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

希望对您有所帮助