Удалить приложение с миграциями Django 1.7
Я хотел бы знать, что самый чистый способ удалить все таблицы для удаленного приложения, используя миграции Django. Если, например, я устанавливаю новый пакет, я добавляю приложение в свой файл settings.py, и я делаю make.py makemigrations и manage.py migrate; когда я решаю, что я не хочу использовать этот пакет, и я удаляю его из моих настроек .py, команда manage.py makemigrations скажет мне, что "никаких изменений не обнаружено", и поэтому manage.py migrate ничего не сделает, но я необходимо удалить таблицы, созданные этим удаленным приложением.
Я ожидал миграции Django, чтобы обработать это, поэтому, если я удалю приложение, он также создаст миграции, чтобы удалить все необходимые таблицы.
Ответы
Ответ 1
вам нужно быть осторожным с этим, убедитесь, что вы понимаете, что операции будут отменены, когда вы это сделаете, но что-то вроде этого должно работать:
manage.py migrate <app_name> zero
очевидно, вам нужно сделать это, прежде чем удалять его из своих настроек, и такие миграции могут быть обнаружены.
edit: это медленно получало несколько upvotes - я решил, что буду направлять всех к соответствующей документации, в частности:
Используйте имя ноль, чтобы удалить все миграции для приложения.
Ответ 2
Во-первых, закомментируйте все классы в вашем приложении models.py. Затем создайте новую миграцию, как обычно, которая удалит все таблицы приложений и запустит ее. Наконец, удалите все приложение и все ссылки на него из базы кода.
Ответ 3
расширяющий nachouve ответ на надлежащую миграцию django, вы можете использовать миграцию RunSQL
со всеми DROP statements
, см. dgango docs.
Вы можете поместить это в приложение, которое вы хотите удалить, или (если вы уже удалили приложение или его установили, чтобы вы не могли его редактировать) в другом приложении.
Например, для очистки после удаления учетных записей django-user (который имеет плохой охват и является обязательством):
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)
]