web/lib/django/core/management/commands/createcachetable.py
author ymh <ymh.work@gmail.com>
Thu, 05 Aug 2010 17:28:09 +0200
changeset 50 012451a812f1
parent 38 77b6da96e6f1
permissions -rw-r--r--
Merge with a2711e44ba5de8b1675d7e0ee6aaa4a6c56a9b46
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
from optparse import make_option
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
from django.core.management.base import LabelCommand
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.db import connections, transaction, models, DEFAULT_DB_ALIAS
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
class Command(LabelCommand):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
    help = "Creates the table needed to use the SQL cache backend."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
    args = "<tablename>"
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
    label = 'tablename'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    option_list = LabelCommand.option_list + (
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
        make_option('--database', action='store', dest='database',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
            default=DEFAULT_DB_ALIAS, help='Nominates a database onto '
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
                'which the cache table will be installed. '
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
                'Defaults to the "default" database.'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    requires_model_validation = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    def handle_label(self, tablename, **options):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
        alias = options.get('database', DEFAULT_DB_ALIAS)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
        connection = connections[alias]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
        fields = (
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
            # "key" is a reserved word in MySQL, so use "cache_key" instead.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
            models.CharField(name='cache_key', max_length=255, unique=True, primary_key=True),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
            models.TextField(name='value'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
            models.DateTimeField(name='expires', db_index=True),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
        )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
        table_output = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        index_output = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        qn = connection.ops.quote_name
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
        for f in fields:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
            field_output = [qn(f.name), f.db_type(connection=connection)]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
            field_output.append("%sNULL" % (not f.null and "NOT " or ""))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
            if f.primary_key:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
                field_output.append("PRIMARY KEY")
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
            elif f.unique:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
                field_output.append("UNIQUE")
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
            if f.db_index:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
                unique = f.unique and "UNIQUE " or ""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
                index_output.append("CREATE %sINDEX %s ON %s (%s);" % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
                    (unique, qn('%s_%s' % (tablename, f.name)), qn(tablename),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
                    qn(f.name)))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
            table_output.append(" ".join(field_output))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        full_statement = ["CREATE TABLE %s (" % qn(tablename)]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        for i, line in enumerate(table_output):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            full_statement.append('    %s%s' % (line, i < len(table_output)-1 and ',' or ''))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        full_statement.append(');')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        curs = connection.cursor()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        curs.execute("\n".join(full_statement))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        for statement in index_output:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
            curs.execute(statement)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        transaction.commit_unless_managed(using=alias)