summaryrefslogtreecommitdiff
path: root/django/core/management/commands/flush.py
blob: c94072fd02e9fbd6d3fe5d680ca484281b775cab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from optparse import make_option

from django.conf import settings
from django.db import connections, transaction, models, DEFAULT_DB_ALIAS
from django.core.management import call_command
from django.core.management.base import NoArgsCommand, CommandError
from django.core.management.color import no_style
from django.core.management.sql import sql_flush, emit_post_sync_signal
from django.utils.importlib import import_module



class Command(NoArgsCommand):
    option_list = NoArgsCommand.option_list + (
        make_option('--noinput', action='store_false', dest='interactive', default=True,
            help='Tells Django to NOT prompt the user for input of any kind.'),
        make_option('--database', action='store', dest='database',
            default=DEFAULT_DB_ALIAS, help='Nominates a database to flush. '
                'Defaults to the "default" database.'),
    )
    help = "Executes ``sqlflush`` on the current database."

    def handle_noargs(self, **options):
        if not options['database']:
            dbs = connections
        else:
            dbs = [options['database']]

        verbosity = int(options.get('verbosity', 1))
        interactive = options.get('interactive')

        self.style = no_style()

        for app_name in settings.INSTALLED_APPS:
            try:
                import_module('.management', app_name)
            except ImportError:
                pass

        for db in dbs:
            connection = connections[db]
            # Import the 'management' module within each installed app, to register
            # dispatcher events.
            sql_list = sql_flush(self.style, connection, only_django=True)

            if interactive:
                confirm = raw_input("""You have requested a flush of the database.
    This will IRREVERSIBLY DESTROY all data currently in the %r database,
    and return each table to the state it was in after syncdb.
    Are you sure you want to do this?

        Type 'yes' to continue, or 'no' to cancel: """ % connection.settings_dict['NAME'])
            else:
                confirm = 'yes'

            if confirm == 'yes':
                try:
                    cursor = connection.cursor()
                    for sql in sql_list:
                        cursor.execute(sql)
                except Exception, e:
                    transaction.rollback_unless_managed(using=db)
                    raise CommandError("""Database %s couldn't be flushed. Possible reasons:
          * The database isn't running or isn't configured correctly.
          * At least one of the expected database tables doesn't exist.
          * The SQL was invalid.
        Hint: Look at the output of 'django-admin.py sqlflush'. That's the SQL this command wasn't able to run.
        The full error: %s""" % (connection.settings_dict['NAME'], e))
                transaction.commit_unless_managed(using=db)

                # Emit the post sync signal. This allows individual
                # applications to respond as if the database had been
                # sync'd from scratch.
                emit_post_sync_signal(models.get_models(), verbosity, interactive, db)

                # Reinstall the initial_data fixture.
                kwargs = options.copy()
                kwargs['database'] = db
                call_command('loaddata', 'initial_data', **kwargs)

            else:
                print "Flush cancelled."