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

时间:2015-02-08 14:16:51

标签: django django-migrations

我想知道什么是使用Django迁移删除已移除应用的所有表的最简洁方法。例如,如果我安装了一个新软件包,我将应用程序添加到我的settings.py中,然后执行manage.py makemigrations和manage.py migrate;然后,当我决定不想使用此软件包并将其从我的settings.py中删除时,命令manage.py makemigrations将告诉我"未检测到任何更改"因此manage.py migrate将不执行任何操作,但我需要删除此删除的应用程序创建的表。

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

3 个答案:

答案 0 :(得分:11)

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

var request = require('request'); request({ method: 'POST', url: 'http://example.com/login', headers: { "User-Agent": "Chocolate 2.0 XD", }, formData: { user_id: "some user", password: "some pass", storecookie: 'on', checkerrors: 'yes' } },function(error, response,body){ if(error){ console.log(error); } else if(response.statuscode !== 200) { console.log(response.body); } });

显然,您必须先执行此操作,然后才能将其从设置中删除,以便可以发现迁移。

编辑:这已经慢慢收到了一些赞成票 - 我想我会引导所有人走向appropriate documentation,特别是:

  

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

将nachouve的答案扩展到正确的django迁移,您可以对所有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)
    ]