如何删除 Django 应用程序数据库中的所有数据?在以前的版本manage.py reset APPNAME
中完成了这项工作,但已被弃用。
如果我们想使用命令行从应用程序中删除所有数据,我们现在应该做什么?
如何删除 Django 应用程序数据库中的所有数据?在以前的版本manage.py reset APPNAME
中完成了这项工作,但已被弃用。
如果我们想使用命令行从应用程序中删除所有数据,我们现在应该做什么?
reset
并且sqlreset
都只是其他管理命令的包装器。sqlreset
特别是可以通过简单地运行来复制:
python manage.py sqlclear myapp
python manage.py sqlall myapp
reset
sqlreset
仅用于在数据库上自动运行结果。就个人而言,我认为删除它是一个绝妙的主意。不过,如果您想要类似的功能,您可以将输出通过管道传输到数据库的 shell 命令。
对于 PostgreSQL,例如:
python manage.py sqlclear myapp | psql mydatabase
python manage.py sqlall myapp | psql mydatabase
如果您想要一个适用于大多数数据库类型的命令,您可以将 sqlclear 生成的 drop table 语句通过管道传输到 dbshell
python manage.py sqlclear myapp | python manage.py dbshell
from django.contrib.contenttypes.models import ContentType
for ct in ContentType.objects.all()
ct.model_class().objects.all().delete()
现在 Django 默认集成了迁移,您首先需要让您的应用程序的迁移首先取消应用然后删除。
这是至少适用于Django 1.8的命令行(替换为要删除所有关联数据的应用程序,并且:
# First, update the DB so it thinks no migrations were applied to the app
python manage.py migrate --fake <app_name> zero
# Erase all migrations in the app folder
rm -r "<app_name>/migrations/*"
# Erase the application tables
python manage.py sqlclear <app_name> | python manage.py dbshell
# Recreate the app tables, that will be empty
python manage.py makemigrations <app_name>
python manage.py migrate <app_name>
如果您想从命令行执行此操作,请创建以下自定义命令:
from django.core.management.base import AppCommand, CommandError
from django.utils.six.moves import input
from django.db import DEFAULT_DB_ALIAS, connections
class Command(AppCommand):
help = (
'Removes ALL DATA related to the given app from the database '
'by calling model.objects.all().delete() for all app models. '
'This also removes related data in other apps via cascade.'
)
def add_arguments(self, parser):
super(Command, self).add_arguments(parser)
parser.add_argument(
'--noinput', '--no-input',
action='store_false', dest='interactive', default=True,
help='Tells Django to NOT prompt the user for input of any kind.',
)
parser.add_argument(
'--database', action='store', dest='database', default=DEFAULT_DB_ALIAS,
help='Nominates a database to reset. Defaults to the "default" database.',
)
def handle_app_config(self, app_config, **options):
app_label = app_config.label
database = options['database']
interactive = options['interactive']
db_name = connections[database].settings_dict['NAME']
confirm = (ask_confirmation(app_label, db_name)
if interactive else 'yes')
if confirm == 'yes':
for model in app_config.get_models():
model.objects.using(database).all().delete()
self.stdout.write('Reset done.\n')
else:
self.stdout.write("Reset cancelled.\n")
def ask_confirmation(app_label, db_name):
return input("""You have requested a reset of the application {app_label}.
This will IRREVERSIBLY DESTROY all data related to the app currently in
the {db_name} database, and return each table to empty state.
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: """.format(**locals()))
将其复制到app/management/commands
任何应用程序文件夹中的文件夹并运行它
./manage.py app_db_tables_reset any_installed_app_name
该命令在django_commands
包中可用,您可以使用
pip install git+http://github.com/mrts/django-commands.git
并将其添加到INSTALLED_APPS
以激活命令。
使用 Django 1.9 测试,它可能适用于 1.8,也可能不适用于 1.8。