使用Django 1.7迁移删除应用程序

16
我想知道使用Django migrations删除已删除应用程序的所有表的最简洁方法。例如,如果我安装了新的软件包,将该应用添加到我的settings.py中,并执行manage.py makemigrations和manage.py migrate;然后,如果我决定不使用此软件包并从我的settings.py中删除它,则命令manage.py makemigrations将告诉我“未检测到更改”,因此manage.py migrate将不会执行任何操作,但我需要删除此已删除应用创建的表。 我期望Django migrations可以处理这个问题,如果我删除一个应用程序,则它也会创建迁移以删除所有必要的表。

为什么不先移除应用程序的所有迁移,然后再移除该应用程序呢? - JuniorCompressor
我修改了问题,我表述不当,希望现在更清楚了! - diegopau
你找到解决方案了吗?我也遇到了麻烦。 - John Z
3个回答

19

对于这个问题,你必须小心处理,确保你理解了反转操作,验证后可以尝试以下方法:

manage.py migrate <app_name> zero

显然,在从设置中删除应用之前,需要执行此操作以便发现迁移。

编辑:该答案已逐渐获得了一些赞 - 我想把大家引向相关文档,特别是:

使用名称“zero”可取消应用程序的所有迁移。


3

首先,在您应用程序的models.py文件中注释掉所有类。然后,像往常一样创建一个新的迁移,它将删除应用程序的所有表,并运行它。最后,从您的代码库中删除整个应用程序以及与之相关的所有引用。


这似乎是一个不错的解决方案,但当应用程序集成到我的项目中时会更有意义,在这种情况下,我只需在我的虚拟环境中安装一个包并将其链接到我的项目,并将其添加到我的settings.py中。 我是 Django 的新手,所以可能是我还没有理解的东西! - diegopau
1
要删除整个应用程序,可以使用“python manage.py migrate [app_name] zero” - potar

3
扩展nachouve的回答以进行正确的Django迁移,您可以使用RunSQL迁移及所有DROP语句,请参阅Django迁移文档。您可以将其放在即将删除的应用程序中,或将其放在不同的应用程序中(如果您已经删除了该应用程序,或者它已安装,因此无法编辑它)。例如,要在删除django-user-accounts后清理(其测试覆盖率较低且是一种风险):
from django.db import migrations

DROP_ACCOUNT_TABLES = """\
    DROP TABLE IF EXISTS account_account CASCADE;
    DROP TABLE IF EXISTS account_accountdeletion CASCADE;
    DROP TABLE IF EXISTS account_emailaddress CASCADE;
    DROP TABLE IF EXISTS account_emailconfirmation CASCADE;
    DROP TABLE IF EXISTS account_signupcode CASCADE;
    DROP TABLE IF EXISTS account_signupcoderesult CASCADE;
"""


class Migration(migrations.Migration):

    dependencies = [
        ('auth', '<< previous migations >>'),
    ]

    operations = [
        migrations.RunSQL(DROP_ACCOUNT_TABLES)
    ]

1
这是我最喜欢的解决方案,但如果其他应用程序中有模型曾经使用到将要被移除的应用程序中的模型的外键,则它仍然无法正常工作。你会收到一个NodeNotFoundError错误:django.db.migrations.exceptions.NodeNotFoundError: Migration other_app.0001_initial dependencies reference nonexistent parent node (app_to_be_removed', u'0001_initial')。有什么想法可以避免这种情况吗? - Ariel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接