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


我想知道什么是使用Django迁移删除所删除应用程序的所有表的最简洁方法。例如,如果我安装了一个新软件包,我将应用程序添加到我的settings.py中,然后执行manage.py makemigrations和manage.py migrate;当我决定我不想使用这个包并从settings.py中删除它时,命令manage.py makemigrations会告诉我“没有检测到任何变化”,所以manage.py migrate将什么都不做,但是我需要删除此删除的应用程序创建的表。

我期望Django迁移处理这个,所以如果我删除一个应用程序,它也会创建迁移以删除所有必要的表。


2451
2018-02-08 14:16


起源

为什么不首先删除应用程序的所有迁移,然后删除应用程序? - JuniorCompressor
我改变了问题,我解释说自己错了,我希望现在更清楚了! - diegopau
你找到了解决方案吗?也遇到了麻烦。 - John Z


答案:


你必须要小心这个,确保你理解当你这样做时正在逆转的操作,但这样的事情应该有效:

manage.py migrate <app_name> zero

显然,在将其从设置中删除之前必须执行此操作,因此可以发现迁移。

编辑:这已经慢慢收到了一些赞成票 - 我想我会引导所有人走向 适当的文件, 尤其是:

使用名称零可以取消应用应用的所有迁移。


6
2017-12-13 05:31





首先,注释掉应用程序的models.py中的所有类。然后,像往常一样创建一个新的迁移,这将删除所有应用程序的表,然后运行它。最后,从代码库中删除整个应用程序及其所有引用。


3
2018-02-08 14:31



这似乎是一个很好的解决方案,但是当应用程序集成到我的项目中时更有意义,在这种情况下,我只是在我的virtualenv中安装一个包并将其链接到我的项目,将其添加到我的settings.py中。我是Django的新手,所以它可能是一些愚蠢的我还没有到来! - diegopau
要删除整个应用程序,可以使用“python manage.py migrate [app_name] zero” - potar


将nachouve的答案扩展到适当的django迁移,你可以使用a RunSQL 全部迁移 DROP statements,请参阅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
2017-08-27 13:06