运行显式创建表的迁移时未创建 Django 表。
Posted
技术标签:
【中文标题】运行显式创建表的迁移时未创建 Django 表。【英文标题】:Django table not created when running migrations that explicitly create table. 【发布时间】:2017-01-08 08:28:58 【问题描述】:在尝试对我的 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 不要应用迁移,但我不知道要寻找什么。
任何建议将不胜感激。谢谢。
【问题讨论】:
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 表。的主要内容,如果未能解决你的问题,请参考以下文章