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

Posted

技术标签:

【中文标题】运行显式创建表的迁移时未创建 Django 表。【英文标题】:Django table not created when running migrations that explicitly create table. 【发布时间】:2017-01-08 08:28:58 【问题描述】:

在尝试对我的 Django 模型进行一些重大更改时,我把一切都搞砸了。幸运的是,我没有提交任何更改,所以我放弃了所有更改。下一步是让我的数据库恢复到以前的状态。最终,我可以成功运行makemigrationsmigrate 命令而不会出现问题。但是,每当我尝试访问该站点时,我都会收到 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 表是在其中创建的),以及它之后的每个模型。然后我再次运行makemigrationsmigrate,但它说没有要应用的迁移,并且我的表仍未创建。

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

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

我的表不是“非托管”表。 我已尝试删除所有迁移并生成新迁移。 我已尝试为整个项目运行 migrate 以及为特定应用程序甚至特定迁移运行迁移

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

任何建议将不胜感激。谢谢。

【问题讨论】:

python manage.py showmigrations 显示什么?它是否将此迁移标记为已应用? @knbk 如果[X] 表示已应用,那么是的,它将所有迁移显示为已应用。 有一个表 django_migrations 保存所有应用迁移的历史。你可以试试看。 @user2976657 感谢您的建议!查看接受的答案,事实证明它与该表有关。 【参考方案1】:

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

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

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

./manage.py migrate my_app 0001 --fake

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

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

希望对你有帮助

【讨论】:

美丽。是的,这成功了。我之前看到django_migrations 表有迁移记录,当我恢复我的实验性更改时,我已经摆脱了这些迁移记录,但不知道如何处理它们,然后忘记了它们。感谢您对该表的工作原理以及如何解决问题进行了简单易懂的解释!

以上是关于运行显式创建表的迁移时未创建 Django 表。的主要内容,如果未能解决你的问题,请参考以下文章

Django 之 文件配置pycharm及django连接数据库创表及表的增删改查

Django 迁移在 Heroku 中失败

通过 Django 模型迁移覆盖表的风险?

Django 1.7 迁移不会重新创建删除的表,为啥?

sqlalchemy 创建表

Django - 迁移后未创建表