删除 ManyToManyField 时 Django 迁移失败
Django migration fails when removing ManyToManyField
在实时网络应用程序中,我有以下模型(删节):
class Ad(models.Model):
name = models.CharField(max_length=50)
apps = models.ManyToManyField(App, null=True, blank=True)
class App(models.Model):
name = models.CharField(max_length=50)
我有以下 tables(在我的暂存环境中):
sqlite> .tables
auth_group
auth_group_permissions
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_flatpage
django_flatpage_sites
django_migrations
django_session
django_site
myapp_app
myapp_ad
我不再希望 Ad
与 App
存在多对多关系,因此我从 Ad
中删除了 apps
。
那么,我运行:
env/bin/python manage.py makemigrations
它产生了这个迁移:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('myapp', '0035_auto_20150818_1302'),
]
operations = [
migrations.RemoveField(
model_name='ad',
name='apps',
),
]
然后,我运行:
env/bin/python manage.py migrate
迁移失败并出现以下错误:
django.db.utils.OperationalError: no such table: myapp_ad_apps
我想这是因为我在第一次使用 ManyToMany 字段时为我创建的多对多 table 幕后操作出了问题。我怎样才能改变我的迁移以使其成功?
对我的问题的评论让我想到了两个解决方案。
来自 GwynBleidD 评论的解决方案:
为了在我的暂存环境的 SQLite 数据库上获得 shell,我 运行:
env/bin/python manage.py dbshell
为了在我的暂存环境中列出 table,我 运行:
sqlite> .tables
我注意到 Django 迁移所抱怨的 table myapp_ad_apps
确实丢失了。
还在数据库里shell,我运行:
sqlite> CREATE TABLE myapp_ad_apps(
... ID INT PRIMARY KEY NOT NULL,
... );
然后,我重新运行迁移,它成功了(并删除了我刚刚创建的table)。
来自knbk评论的解决方案:
为了运行迁移是假的,我运行:
env/bin/python manage.py migrate --fake
这也解决了问题,独立于第一个解决方案。
在实时网络应用程序中,我有以下模型(删节):
class Ad(models.Model):
name = models.CharField(max_length=50)
apps = models.ManyToManyField(App, null=True, blank=True)
class App(models.Model):
name = models.CharField(max_length=50)
我有以下 tables(在我的暂存环境中):
sqlite> .tables
auth_group
auth_group_permissions
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_flatpage
django_flatpage_sites
django_migrations
django_session
django_site
myapp_app
myapp_ad
我不再希望 Ad
与 App
存在多对多关系,因此我从 Ad
中删除了 apps
。
那么,我运行:
env/bin/python manage.py makemigrations
它产生了这个迁移:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('myapp', '0035_auto_20150818_1302'),
]
operations = [
migrations.RemoveField(
model_name='ad',
name='apps',
),
]
然后,我运行:
env/bin/python manage.py migrate
迁移失败并出现以下错误:
django.db.utils.OperationalError: no such table: myapp_ad_apps
我想这是因为我在第一次使用 ManyToMany 字段时为我创建的多对多 table 幕后操作出了问题。我怎样才能改变我的迁移以使其成功?
对我的问题的评论让我想到了两个解决方案。
来自 GwynBleidD 评论的解决方案:
为了在我的暂存环境的 SQLite 数据库上获得 shell,我 运行:
env/bin/python manage.py dbshell
为了在我的暂存环境中列出 table,我 运行:
sqlite> .tables
我注意到 Django 迁移所抱怨的 table myapp_ad_apps
确实丢失了。
还在数据库里shell,我运行:
sqlite> CREATE TABLE myapp_ad_apps(
... ID INT PRIMARY KEY NOT NULL,
... );
然后,我重新运行迁移,它成功了(并删除了我刚刚创建的table)。
来自knbk评论的解决方案:
为了运行迁移是假的,我运行:
env/bin/python manage.py migrate --fake
这也解决了问题,独立于第一个解决方案。