Pregunta ¿Cómo borrar todos los datos de una aplicación en Django 1.4 ahora que el restablecimiento se ha ido?


¿Cómo borro todos los datos en la base de datos para la aplicación Django? En la versión anterior manage.py reset APPNAME hizo el trabajo, pero eso ha sido desaprobado.

¿Qué se supone que debemos hacer ahora si queremos eliminar todos los datos de una aplicación usando la línea de comando?


6
2018-06-29 17:33


origen


Respuestas:


reset y sqlreset ambos eran solo envoltorios alrededor de otros comandos de administración. sqlreset en particular, se puede duplicar simplemente ejecutando:

python manage.py sqlclear myapp
python manage.py sqlall myapp

reset solo sirvió para ejecutar automáticamente el resultado de sqlreset en la base de datos. Personalmente, creo que eliminar eso es una idea fantástica. Aún así, si desea una funcionalidad similar, puede canalizar la salida a los comandos de shell de su base de datos.

Para PostgreSQL, por ejemplo:

python manage.py sqlclear myapp | psql mydatabase
python manage.py sqlall myapp | psql mydatabase

15
2018-06-29 18:57



Si desea un solo comando que funcione con la mayoría de los tipos de bases de datos, puede canalizar las instrucciones de la tabla desplegable, que sqlclear genera, a dbshell

python manage.py sqlclear myapp | python manage.py dbshell


8
2018-02-05 23:41



from django.contrib.contenttypes.models import ContentType
for ct in ContentType.objects.all()
    ct.model_class().objects.all().delete()

5
2018-06-29 17:57



Ahora que Django integra las migraciones de forma predeterminada, primero debe hacer que las migraciones de su aplicación se apliquen primero y luego se eliminen.

Aquí está la línea de comando que funciona al menos con Django 1.8 (reemplazando por la aplicación que desea eliminar todos los datos asociados y:

# 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>

2
2017-08-12 11:54



DIY

Si desea hacer eso desde la línea de comando, cree lo siguiente comando personalizado:

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()))

Cópialo a app/management/commands carpeta en cualquiera de sus carpetas de aplicaciones y ejecutarlo con

./manage.py app_db_tables_reset any_installed_app_name

Paquete listo

El comando está disponible en django_commands  paquete, puedes instalarlo con

pip install git+http://github.com/mrts/django-commands.git

y agregarlo a INSTALLED_APPS para activar el comando.

Probado con Django 1.9, puede o no funcionar con 1.8.


0
2018-06-25 12:29