当显式创建 table 的 运行 迁移时未创建 Django table。
Django table not created when running migrations that explicitly create table.
在尝试对我的 Django 模型进行一些重大更改时,我把一切都搞砸了。幸运的是,我没有提交任何更改,所以我放弃了所有更改。下一步是让我的数据库恢复到以前的状态。最终,我达到了可以毫无问题地成功 运行 makemigrations
和 migrate
命令的地步。但是,每当我尝试访问该站点时,我都会收到 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 创建的地方),以及它之后的每个模型。然后我再次 运行 makemigrations
和 migrate
,但是它说没有要应用的迁移,而且我的 table 仍然没有创建。
我的问题是:为什么我 运行 迁移时没有创建我的 table? 我知道我可以手动创建 table 在 MySQL 中,但我想知道我做错了什么以这种方式弄乱了我的数据库。
我已经看到许多与 table 未创建和未应用迁移相关的 SO 帖子,但我还没有找到适合我的内容。
- 我的 table 不是 "unmanaged" table。
- 我已经尝试删除所有迁移并生成新迁移。
- 我已经尝试 运行ning
migrate
整个项目以及 运行ning 特定应用程序的迁移甚至特定的迁移
我的假设是我的数据库本身有一些东西告诉 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
希望对您有所帮助
在尝试对我的 Django 模型进行一些重大更改时,我把一切都搞砸了。幸运的是,我没有提交任何更改,所以我放弃了所有更改。下一步是让我的数据库恢复到以前的状态。最终,我达到了可以毫无问题地成功 运行 makemigrations
和 migrate
命令的地步。但是,每当我尝试访问该站点时,我都会收到 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 创建的地方),以及它之后的每个模型。然后我再次 运行 makemigrations
和 migrate
,但是它说没有要应用的迁移,而且我的 table 仍然没有创建。
我的问题是:为什么我 运行 迁移时没有创建我的 table? 我知道我可以手动创建 table 在 MySQL 中,但我想知道我做错了什么以这种方式弄乱了我的数据库。
我已经看到许多与 table 未创建和未应用迁移相关的 SO 帖子,但我还没有找到适合我的内容。
- 我的 table 不是 "unmanaged" table。
- 我已经尝试删除所有迁移并生成新迁移。
- 我已经尝试 运行ning
migrate
整个项目以及 运行ning 特定应用程序的迁移甚至特定的迁移
我的假设是我的数据库本身有一些东西告诉 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
希望对您有所帮助