【问题标题】:Remove app with Django 1.7 migrations使用 Django 1.7 迁移删除应用程序
【发布时间】:2015-04-08 07:36:37
【问题描述】:

我想知道使用 Django 迁移为已删除的应用程序删除所有表的最干净的方法是什么。例如,如果我安装了一个新包,我将应用程序添加到我的 settings.py 并执行 manage.py makemigrations 和 manage.py migrate;当我决定不想使用这个包并将它从我的 settings.py 中删除时,命令 manage.py makemigrations 将告诉我“未检测到更改”,因此 manage.py migrate 将什么也不做,但我需要删除此已删除应用创建的表。

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

【问题讨论】:

  • 为什么不先删除应用的所有迁移,然后再删除应用?
  • 我改了问题,我解释错了,希望现在更清楚!
  • 您找到解决方案了吗?对此也有问题。

标签: django django-migrations


【解决方案1】:

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

【讨论】:

  • 这似乎是一个很好的解决方案,但是当应用程序集成到我的项目中时更有意义,在这种情况下,我只是在我的 virtualenv 中安装一个包并将其链接到我的项目,并将其添加到我的设置.py。我是 Django 新手,所以这可能是我还没有得到的愚蠢的东西!
  • 删除整个应用可以使用“python manage.py migrate [app_name] zero”
【解决方案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)
    ]

【讨论】:

  • 这是我最喜欢的解决方案,但如果在其他应用程序上您的模型曾经对要删除的应用程序中的模型具有外键,它仍然不起作用。你会得到一个 NodeNotFoundError:django.db.migrations.exceptions.NodeNotFoundError: Migration other_app.0001_initial dependencies reference nonexistent parent node (app_to_be_removed', u'0001_initial')。关于如何避免这种情况的任何想法?
【解决方案3】:

你必须小心这个,确保你理解当你这样做时被反转的操作,但是这样的事情应该可以工作:

manage.py migrate &lt;app_name&gt; zero

显然,您必须在将其从设置中删除之前执行此操作,这样才能发现迁移。

编辑:这已经慢慢地收到了一些支持 - 我想我会把大家引向appropriate documentation,特别是:

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

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 2015-10-09
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多