OracleBranch: django-oracle-rev5046.diff

File django-oracle-rev5046.diff, 83.7 KB (added by Matt Boersma, 18 years ago)

Updated after we fixed #4093, also ignore whitespace diffs this time.

  • django/db/backends/mysql/base.py

     
    131131            self.server_version = tuple([int(x) for x in m.groups()])
    132132        return self.server_version
    133133
     134
     135
     136
     137
     138
    134139supports_constraints = True
     140
     141
    135142
    136143def quote_name(name):
    137144    if name.startswith("`") and name.endswith("`"):
     
    164171        sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str)
    165172    return sql
    166173
     174
     175
     176
    167177def get_limit_offset_sql(limit, offset=None):
    168178    sql = "LIMIT "
    169179    if offset and offset != 0:
     
    185195def get_pk_default_value():
    186196    return "DEFAULT"
    187197
     198
     199
     200
     201
     202
     203
     204
     205
     206
    188207def get_sql_flush(style, tables, sequences):
    189208    """Return a list of SQL statements required to remove all data from
    190209    all tables in the database (without actually removing the tables
  • django/db/backends/ado_mssql/base.py

     
    8888            self.connection.close()
    8989            self.connection = None
    9090
     91
     92
     93
     94
     95
    9196supports_constraints = True
     97
     98
    9299
    93100def quote_name(name):
    94101    if name.startswith('[') and name.endswith(']'):
     
    116123    if lookup_type=='day':
    117124        return "Convert(datetime, Convert(varchar(12), %s))" % field_name
    118125
     126
     127
     128
    119129def get_limit_offset_sql(limit, offset=None):
    120130    # TODO: This is a guess. Make sure this is correct.
    121131    sql = "LIMIT %s" % limit
     
    138148def get_pk_default_value():
    139149    return "DEFAULT"
    140150
     151
     152
     153
     154
     155
     156
     157
     158
     159
     160
     161
     162
    141163def get_sql_flush(style, tables, sequences):
    142164    """Return a list of SQL statements required to remove all data from
    143165    all tables in the database (without actually removing the tables
  • django/db/backends/postgresql/base.py

     
    104104            self.connection.close()
    105105            self.connection = None
    106106
     107
     108
     109
     110
     111
    107112supports_constraints = True
     113
     114
    108115
    109116def quote_name(name):
    110117    if name.startswith('"') and name.endswith('"'):
     
    137144    # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
    138145    return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
    139146
     147
     148
     149
    140150def get_limit_offset_sql(limit, offset=None):
    141151    sql = "LIMIT %s" % limit
    142152    if offset and offset != 0:
     
    158168def get_pk_default_value():
    159169    return "DEFAULT"
    160170
     171
     172
     173
     174
     175
     176
     177
     178
     179
    161180def get_sql_flush(style, tables, sequences):
    162181    """Return a list of SQL statements required to remove all data from
    163182    all tables in the database (without actually removing the tables
  • django/db/backends/sqlite3/base.py

     
    9999    def convert_query(self, query, num_params):
    100100        return query % tuple("?" * num_params)
    101101
     102
     103
     104
     105
     106
    102107supports_constraints = False
     108
     109
    103110
    104111def quote_name(name):
    105112    if name.startswith('"') and name.endswith('"'):
     
    131138    # sqlite doesn't support DATE_TRUNC, so we fake it as above.
    132139    return 'django_date_trunc("%s", %s)' % (lookup_type.lower(), field_name)
    133140
     141
     142
     143
    134144def get_limit_offset_sql(limit, offset=None):
    135145    sql = "LIMIT %s" % limit
    136146    if offset and offset != 0:
     
    152162def get_pk_default_value():
    153163    return "NULL"
    154164
     165
     166
     167
     168
     169
     170
     171
     172
     173
    155174def get_sql_flush(style, tables, sequences):
    156175    """Return a list of SQL statements required to remove all data from
    157176    all tables in the database (without actually removing the tables
  • django/db/backends/util.py

     
    11import datetime
     2
    23from time import time
    34
    45class CursorDebugWrapper(object):
     
    9293def rev_typecast_boolean(obj, d):
    9394    return obj and '1' or '0'
    9495
     96
     97
     98
     99
     100
     101
     102
     103
     104
     105
    95106##################################################################################
    96107# Helper functions for dictfetch* for databases that don't natively support them #
    97108##################################################################################
  • django/db/backends/oracle/base.py

     
    44Requires cx_Oracle: http://www.python.net/crew/atuining/cx_Oracle/
    55"""
    66
     7
    78from django.db.backends import util
    89try:
    910    import cx_Oracle as Database
    1011except ImportError, e:
    1112    from django.core.exceptions import ImproperlyConfigured
    1213    raise ImproperlyConfigured, "Error loading cx_Oracle module: %s" % e
     14
     15
    1316
     17
    1418DatabaseError = Database.Error
    1519
    1620try:
     
    3034        return self.connection is not None
    3135
    3236    def cursor(self):
    33         from django.conf import settings
    3437        if not self._valid_connection():
    3538            if len(settings.DATABASE_HOST.strip()) == 0:
    3639                settings.DATABASE_HOST = 'localhost'
     
    4043            else:
    4144                conn_string = "%s/%s@%s" % (settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME)
    4245                self.connection = Database.connect(conn_string, **self.options)
    43         return FormatStylePlaceholderCursor(self.connection)
     46        cursor = FormatStylePlaceholderCursor(self.connection)
     47        # default arraysize of 1 is highly sub-optimal
     48        cursor.arraysize = 100
     49        # set oracle date to ansi date format
     50        cursor.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'")
     51        cursor.execute("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'")
     52        if settings.DEBUG:
     53            return util.CursorDebugWrapper(cursor, self)
     54        return cursor
    4455
    4556    def _commit(self):
    4657        if self.connection is not None:
    47             self.connection.commit()
     58            self.connection.commit()
    4859
    4960    def _rollback(self):
    5061        if self.connection is not None:
    51             try:
    52                 self.connection.rollback()
    53             except Database.NotSupportedError:
    54                 pass
     62            return self.connection.rollback()
    5563
    5664    def close(self):
    5765        if self.connection is not None:
    5866            self.connection.close()
    5967            self.connection = None
    6068
     69
     70
     71
     72
     73
    6174supports_constraints = True
     75
     76
    6277
    6378class FormatStylePlaceholderCursor(Database.Cursor):
    6479    """
     
    6681    This fixes it -- but note that if you want to use a literal "%s" in a query,
    6782    you'll need to use "%%s".
    6883    """
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
     100
     101
    69102    def execute(self, query, params=None):
    70         if params is None: params = []
    71         query = self.convert_arguments(query, len(params))
     103        query, params = self._rewrite_args(query, params)
    72104        return Database.Cursor.execute(self, query, params)
    73105
    74106    def executemany(self, query, params=None):
    75         if params is None: params = []
    76         query = self.convert_arguments(query, len(params[0]))
     107        query, params = self._rewrite_args(query, params)
    77108        return Database.Cursor.executemany(self, query, params)
    78109
    79     def convert_arguments(self, query, num_params):
    80         # replace occurances of "%s" with ":arg" - Oracle requires colons for parameter placeholders.
    81         args = [':arg' for i in range(num_params)]
    82         return query % tuple(args)
    83 
    84110def quote_name(name):
    85     return name
     111    # SQL92 requires delimited (quoted) names to be case-sensitive.  When
     112    # not quoted, Oracle has case-insensitive behavior for identifiers, but
     113    # always defaults to uppercase.
     114    # We simplify things by making Oracle identifiers always uppercase.
     115    if not name.startswith('"') and not name.endswith('"'):
     116        name = '"%s"' % util.truncate_name(name.upper(), get_max_name_length())
     117    return name.upper()
    86118
    87119dictfetchone = util.dictfetchone
    88120dictfetchmany = util.dictfetchmany
    89121dictfetchall  = util.dictfetchall
    90122
    91123def get_last_insert_id(cursor, table_name, pk_name):
    92     query = "SELECT %s_sq.currval from dual" % table_name
    93     cursor.execute(query)
     124   
     125    cursor.execute()
    94126    return cursor.fetchone()[0]
    95127
    96128def get_date_extract_sql(lookup_type, table_name):
    97129    # lookup_type is 'year', 'month', 'day'
    98     # http://www.psoug.org/reference/date_func.html
     130    # http://
    99131    return "EXTRACT(%s FROM %s)" % (lookup_type, table_name)
    100132
    101133def get_date_trunc_sql(lookup_type, field_name):
    102     return "EXTRACT(%s FROM TRUNC(%s))" % (lookup_type, field_name)
     134    # lookup_type is 'year', 'month', 'day'
     135    # Oracle uses TRUNC() for both dates and numbers.
     136    # http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96540/functions155a.htm#SQLRF06151
     137    if lookup_type == 'day':
     138        sql = 'TRUNC(%s)' % (field_name,)
     139    else:
     140        sql = "TRUNC(%s, '%s')" % (field_name, lookup_type)
     141    return sql
    103142
     143
     144
     145
    104146def get_limit_offset_sql(limit, offset=None):
    105147    # Limits and offset are too complicated to be handled here.
    106     # Instead, they are handled in django/db/query.py.
    107     pass
     148    # Instead, they are handled in django/db/query.py.
     149   
    108150
    109151def get_random_function_sql():
    110152    return "DBMS_RANDOM.RANDOM"
     
    116158    raise NotImplementedError
    117159
    118160def get_drop_foreignkey_sql():
    119     return "DROP FOREIGN KEY"
     161    return "DROP "
    120162
    121163def get_pk_default_value():
    122164    return "DEFAULT"
    123165
     166
     167
     168
     169
     170
     171
     172
     173
     174
     175
     176
     177
     178
     179
     180
     181
     182
     183
     184
     185
     186
     187
     188
     189
     190
     191
     192
     193
     194
     195
     196
     197
     198
     199
     200
     201
     202
     203
     204
     205
     206
     207
     208
     209
     210
     211
    124212def get_sql_flush(style, tables, sequences):
    125213    """Return a list of SQL statements required to remove all data from
    126214    all tables in the database (without actually removing the tables
    127215    themselves) and put the database in an empty 'initial' state
    128216    """
    129     # Return a list of 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements
    130     # TODO - SQL not actually tested against Oracle yet!
    131     # TODO - autoincrement indices reset required? See other get_sql_flush() implementations
    132     sql = ['%s %s;' % \
    133             (style.SQL_KEYWORD('TRUNCATE'),
     217    # Return a list of 'TRUNCATE x;', 'TRUNCATE y;',
     218    # 'TRUNCATE z;'... style SQL statements
     219    if tables:
     220        # Oracle does support TRUNCATE, but it seems to get us into
     221        # FK referential trouble, whereas DELETE FROM table works.
     222        sql = ['%s %s %s;' % \
     223                (style.SQL_KEYWORD('DELETE'),
     224                 style.SQL_KEYWORD('FROM'),
    134225             style.SQL_FIELD(quote_name(table))
    135226             )  for table in tables]
     227
     228
     229
     230
     231
     232
     233
     234
     235
     236
     237
    136238
     239
     240
     241
     242
    137243def get_sql_sequence_reset(style, model_list):
    138244    "Returns a list of the SQL statements to reset sequences for the given models."
    139     # No sequence reset required
    140     return []
     245    from django.db import models
     246    output = []
     247    query = _get_sequence_reset_sql()
     248    for model in model_list:
     249        for f in model._meta.fields:
     250            if isinstance(f, models.AutoField):
     251                sequence_name = get_sequence_name(model._meta.db_table)
     252                output.append(query % {'sequence':sequence_name,
     253                                       'table':model._meta.db_table})
     254                break # Only one AutoField is allowed per model, so don't bother continuing.
     255        for f in model._meta.many_to_many:
     256            sequence_name = get_sequence_name(f.m2m_db_table())
     257            output.append(query % {'sequence':sequence_name,
     258                                   'table':f.m2m_db_table()})
     259    return output
    141260
     261
     262
     263
     264
     265
     266
     267
     268
     269
     270
     271
     272
     273
     274
     275
     276
     277
     278
     279
     280
     281
     282
     283
     284
     285
     286
     287
     288
     289
     290
     291
     292
     293
     294
     295
     296
     297
     298
     299
     300
     301
     302
     303
     304
     305
     306
     307
     308
     309
     310
     311
     312
     313
     314
     315
     316
     317
     318
     319
     320
     321
     322
     323
     324
     325
     326
     327
     328
     329
     330
     331
     332
     333
     334
     335
     336
     337
     338
     339
     340
     341
     342
     343
     344
     345
     346
     347
     348
     349
     350
     351
     352
     353
     354
     355
     356
     357
     358
     359
     360
     361
     362
     363
     364
     365
     366
     367
     368
     369
     370
     371
     372
     373
     374
     375
     376
     377
     378
     379
     380
     381
     382
     383
     384
     385
     386
     387
     388
     389
     390
     391
     392
     393
     394
     395
     396
     397
     398
     399
     400
     401
     402
     403
     404
     405
     406
     407
     408
     409
     410
     411
     412
     413
     414
     415
     416
     417
     418
     419
     420
     421
     422
     423
     424
     425
     426
     427
     428
     429
     430
     431
     432
     433
     434
     435
     436
     437
     438
     439
     440
     441
     442
     443
     444
     445
     446
     447
     448
     449
     450
     451
     452
     453
     454
     455
     456
     457
     458
     459
     460
     461
     462
     463
     464
     465
     466
     467
     468
     469
     470
     471
     472
     473
     474
     475
     476
     477
     478
     479
     480
     481
     482
     483
     484
     485
     486
     487
     488
     489
     490
     491
     492
     493
     494
     495
     496
     497
     498
     499
     500
    142501OPERATOR_MAPPING = {
    143502    'exact': '= %s',
    144     'iexact': 'LIKE %s',
    145     'contains': 'LIKE %s',
    146     'icontains': 'LIKE %s',
     503    'iexact': '',
     504    'contains': ,
     505    'icontains': ,
    147506    'gt': '> %s',
    148507    'gte': '>= %s',
    149508    'lt': '< %s',
    150509    'lte': '<= %s',
    151     'startswith': 'LIKE %s',
    152     'endswith': 'LIKE %s',
    153     'istartswith': 'LIKE %s',
    154     'iendswith': 'LIKE %s',
     510    'startswith': ,
     511    'endswith': ,
     512    'istartswith': ,
     513    'iendswith': ,
    155514}
  • django/db/backends/oracle/client.py

     
    22import os
    33
    44def runshell():
    5     args = ''
    6     args += settings.DATABASE_USER
     5    dsn = settings.DATABASE_USER
    76    if settings.DATABASE_PASSWORD:
    8         args += "/%s" % settings.DATABASE_PASSWORD
    9     args += "@%s" % settings.DATABASE_NAME
    10     os.execvp('sqlplus', args)
     7        dsn += "/%s" % settings.DATABASE_PASSWORD
     8    if settings.DATABASE_NAME:
     9        dsn += "@%s" % settings.DATABASE_NAME
     10    args = ["sqlplus", "-L", dsn]
     11    os.execvp("sqlplus", args)
  • django/db/backends/oracle/introspection.py

     
     1
    12import re
     3
    24
     5
    36foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)")
    47
    58def get_table_list(cursor):
    69    "Returns a list of table names in the current database."
    710    cursor.execute("SELECT TABLE_NAME FROM USER_TABLES")
    8     return [row[0] for row in cursor.fetchall()]
     11    return [row[0] for row in cursor.fetchall()]
    912
    1013def get_table_description(cursor, table_name):
    11     return table_name
     14    "Returns a description of the table, with the DB-API cursor.description interface."
     15    cursor.execute("SELECT * FROM %s WHERE ROWNUM < 2" % quote_name(table_name))
     16    return cursor.description
    1217
    1318def _name_to_index(cursor, table_name):
    1419    """
     
    2227    Returns a dictionary of {field_index: (field_index_other_table, other_table)}
    2328    representing all relationships to the given table. Indexes are 0-based.
    2429    """
    25     raise NotImplementedError
     30    cursor.execute("""
     31SELECT ta.column_id - 1, tb.table_name, tb.column_id - 1
     32FROM   user_constraints, USER_CONS_COLUMNS ca, USER_CONS_COLUMNS cb,
     33       user_tab_cols ta, user_tab_cols tb
     34WHERE  user_constraints.table_name = %s AND
     35       ta.table_name = %s AND
     36       ta.column_name = ca.column_name AND
     37       ca.table_name = %s AND
     38       user_constraints.constraint_name = ca.constraint_name AND
     39       user_constraints.r_constraint_name = cb.constraint_name AND
     40       cb.table_name = tb.table_name AND
     41       cb.column_name = tb.column_name AND
     42       ca.position = cb.position""", [table_name, table_name, table_name])
    2643
     44
     45
     46
     47
     48
    2749def get_indexes(cursor, table_name):
    2850    """
    2951    Returns a dictionary of fieldname -> infodict for the given table,
     
    3153        {'primary_key': boolean representing whether it's the primary key,
    3254         'unique': boolean representing whether it's a unique index}
    3355    """
    34     raise NotImplementedError
     56    # This query retrieves each index on the given table, including the
     57    # first associated field name
     58    # "We were in the nick of time; you were in great peril!"
     59    sql = """
     60WITH primarycols AS (
     61 SELECT user_cons_columns.table_name, user_cons_columns.column_name, 1 AS PRIMARYCOL
     62 FROM   user_cons_columns, user_constraints
     63 WHERE  user_cons_columns.constraint_name = user_constraints.constraint_name AND
     64        user_constraints.constraint_type = 'P' AND
     65        user_cons_columns.table_name = %s),
     66 uniquecols AS (
     67 SELECT user_ind_columns.table_name, user_ind_columns.column_name, 1 AS UNIQUECOL
     68 FROM   user_indexes, user_ind_columns
     69 WHERE  uniqueness = 'UNIQUE' AND
     70        user_indexes.index_name = user_ind_columns.index_name AND
     71        user_ind_columns.table_name = %s)
     72SELECT allcols.column_name, primarycols.primarycol, uniquecols.UNIQUECOL
     73FROM   (SELECT column_name FROM primarycols UNION SELECT column_name FROM
     74uniquecols) allcols,
     75      primarycols, uniquecols
     76WHERE  allcols.column_name = primarycols.column_name (+) AND
     77      allcols.column_name = uniquecols.column_name (+)
     78    """
     79    cursor.execute(sql, [table_name, table_name])
     80    indexes = {}
     81    for row in cursor.fetchall():
     82        # row[1] (idx.indkey) is stored in the DB as an array. It comes out as
     83        # a string of space-separated integers. This designates the field
     84        # indexes (1-based) of the fields that have indexes on the table.
     85        # Here, we skip any indexes across multiple fields.
     86        indexes[row[0]] = {'primary_key': row[1], 'unique': row[2]}
     87    return indexes
    3588
    36 # Maps type codes to Django Field types.
     89# Maps type s to Django Field types.
    3790DATA_TYPES_REVERSE = {
    38     16: 'BooleanField',
    39     21: 'SmallIntegerField',
    40     23: 'IntegerField',
    41     25: 'TextField',
    42     869: 'IPAddressField',
    43     1043: 'CharField',
    44     1082: 'DateField',
    45     1083: 'TimeField',
    46     1114: 'DateTimeField',
    47     1184: 'DateTimeField',
    48     1266: 'TimeField',
    49     1700: 'FloatField',
     91    cx_Oracle.CLOB: 'TextField',
     92    cx_Oracle.DATETIME: 'DateTimeField',
     93    cx_Oracle.FIXED_CHAR: 'CharField',
     94    cx_Oracle.NCLOB: 'TextField',
     95    cx_Oracle.NUMBER: 'FloatField',
     96    cx_Oracle.STRING: 'TextField',
     97    cx_Oracle.TIMESTAMP: 'DateTimeField',
    5098}
  • django/db/backends/oracle/creation.py

     
     1
     2
     3
     4
     5
     6
     7
    18DATA_TYPES = {
    2     'AutoField':         'number(38)',
    3     'BooleanField':      'number(1)',
    4     'CharField':         'varchar2(%(maxlength)s)',
    5     'CommaSeparatedIntegerField': 'varchar2(%(maxlength)s)',
    6     'DateField':         'date',
    7     'DateTimeField':     'date',
    8     'FileField':         'varchar2(100)',
    9     'FilePathField':     'varchar2(100)',
    10     'FloatField':        'number(%(max_digits)s, %(decimal_places)s)',
    11     'ImageField':        'varchar2(100)',
    12     'IntegerField':      'integer',
    13     'IPAddressField':    'char(15)',
     9    'AutoField':         )',
     10    'BooleanField':      )',
     11    'CharField':         2(%(maxlength)s)',
     12    'CommaSeparatedIntegerField': 2(%(maxlength)s)',
     13    'DateField':         ',
     14    'DateTimeField':     ',
     15    'FileField':         2(100)',
     16    'FilePathField':     2(100)',
     17    'FloatField':        (%(max_digits)s, %(decimal_places)s)',
     18    'ImageField':        2(100)',
     19    'IntegerField':      ',
     20    'IPAddressField':    (15)',
    1421    'ManyToManyField':   None,
    15     'NullBooleanField':  'integer',
    16     'OneToOneField':     'integer',
    17     'PhoneNumberField':  'varchar(20)',
    18     'PositiveIntegerField': 'integer',
    19     'PositiveSmallIntegerField': 'smallint',
    20     'SlugField':         'varchar(50)',
    21     'SmallIntegerField': 'smallint',
    22     'TextField':         'long',
    23     'TimeField':         'timestamp',
    24     'USStateField':      'varchar(2)',
     22    'NullBooleanField':             'NUMBER(1) CHECK ((%(column)s IN (0,1)) OR (%(column)s IS NULL))',
     23    'OneToOneField':                'NUMBER(11)',
     24    'PhoneNumberField':             'VARCHAR2(20)',
     25    'PositiveIntegerField':         'NUMBER(11) CHECK (%(column)s >= 0)',
     26    'PositiveSmallIntegerField':    'NUMBER(11) CHECK (%(column)s >= 0)',
     27    'SlugField':                    'VARCHAR2(50)',
     28    'SmallIntegerField':            'NUMBER(11)',
     29    'TextField':                    'NCLOB',
     30    'TimeField':                    'TIMESTAMP',
     31    'URLField':                     'VARCHAR2(200)',
     32    'USStateField':                 'CHAR(2)',
    2533}
     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
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
     100
     101
     102
     103
     104
     105
     106
     107
     108
     109
     110
     111
     112
     113
     114
     115
     116
     117
     118
     119
     120
     121
     122
     123
     124
     125
     126
     127
     128
     129
     130
     131
     132
     133
     134
     135
     136
     137
     138
     139
     140
     141
     142
     143
     144
     145
     146
     147
     148
     149
     150
     151
     152
     153
     154
     155
     156
     157
     158
     159
     160
     161
     162
     163
     164
     165
     166
     167
     168
     169
     170
     171
     172
     173
     174
     175
     176
     177
     178
     179
     180
     181
     182
     183
     184
     185
     186
     187
     188
     189
     190
     191
     192
     193
     194
     195
     196
     197
     198
     199
     200
     201
     202
     203
     204
     205
     206
     207
     208
     209
     210
     211
     212
     213
     214
     215
     216
     217
     218
     219
     220
     221
     222
     223
     224
     225
     226
     227
     228
     229
     230
     231
     232
     233
     234
     235
     236
     237
     238
     239
     240
     241
     242
     243
     244
     245
     246
     247
     248
     249
     250
     251
     252
     253
     254
     255
     256
     257
     258
     259
     260
     261
     262
     263
     264
     265
     266
     267
     268
     269
     270
     271
     272
     273
     274
     275
     276
     277
     278
     279
     280
     281
     282
     283
     284
     285
     286
     287
     288
     289
     290
     291
     292
     293
     294
     295
     296
     297
     298
     299
     300
     301
     302
     303
  • django/db/backends/postgresql_psycopg2/base.py

     
    7272            self.connection.close()
    7373            self.connection = None
    7474
     75
     76
     77
     78
     79
    7580supports_constraints = True
     81
     82
    7683
    7784def quote_name(name):
    7885    if name.startswith('"') and name.endswith('"'):
     
    97104    # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
    98105    return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
    99106
     107
     108
     109
    100110def get_limit_offset_sql(limit, offset=None):
    101111    sql = "LIMIT %s" % limit
    102112    if offset and offset != 0:
     
    118128def get_pk_default_value():
    119129    return "DEFAULT"
    120130
     131
     132
     133
     134
     135
     136
     137
     138
     139
    121140def get_sql_flush(style, tables, sequences):
    122141    """Return a list of SQL statements required to remove all data from
    123142    all tables in the database (without actually removing the tables
  • django/db/backends/dummy/base.py

     
    2727        pass # close()
    2828
    2929supports_constraints = False
     30
    3031quote_name = complain
    3132dictfetchone = complain
    3233dictfetchmany = complain
  • django/db/models/base.py

     
    210210        record_exists = True
    211211        if pk_set:
    212212            # Determine whether a record with the primary key already exists.
    213             cursor.execute("SELECT 1 FROM %s WHERE %s=%%s LIMIT 1" % \
     213            cursor.execute("SELECT " % \
    214214                (backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.pk.column)), [pk_val])
    215215            # If it does already exist, do an UPDATE.
    216             if cursor.fetchone():
     216            if cursor.fetchone():
    217217                db_values = [f.get_db_prep_save(f.pre_save(self, False)) for f in non_pks]
    218218                if db_values:
    219219                    cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % \
  • django/db/models/options.py

     
    1313
    1414DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
    1515                 'unique_together', 'permissions', 'get_latest_by',
    16                  'order_with_respect_to', 'app_label')
     16                 'order_with_respect_to', 'app_label')
    1717
    1818class Options(object):
    1919    def __init__(self, meta):
     
    2727        self.object_name, self.app_label = None, None
    2828        self.get_latest_by = None
    2929        self.order_with_respect_to = None
     30
    3031        self.admin = None
    3132        self.meta = meta
    3233        self.pk = None
     
    5960        del self.meta
    6061
    6162    def _prepare(self, model):
     63
     64
    6265        if self.order_with_respect_to:
    6366            self.order_with_respect_to = self.get_field(self.order_with_respect_to)
    6467            self.ordering = ('_order',)
     
    7376        # If the db_table wasn't provided, use the app_label + module_name.
    7477        if not self.db_table:
    7578            self.db_table = "%s_%s" % (self.app_label, self.module_name)
     79
     80
    7681
    7782    def add_field(self, field):
    7883        # Insert the given field in the order in which it was created, using
  • django/db/models/fields/__init__.py

     
    7070        core=False, rel=None, default=NOT_PROVIDED, editable=True, serialize=True,
    7171        prepopulate_from=None, unique_for_date=None, unique_for_month=None,
    7272        unique_for_year=None, validator_list=None, choices=None, radio_admin=None,
    73         help_text='', db_column=None):
     73        help_text='', db_column=None):
    7474        self.name = name
    7575        self.verbose_name = verbose_name
    7676        self.primary_key = primary_key
     
    8787        self.radio_admin = radio_admin
    8888        self.help_text = help_text
    8989        self.db_column = db_column
     90
    9091
    9192        # Set db_index to True if the field has a relationship and doesn't explicitly set db_index.
    9293        self.db_index = db_index
     
    161162
    162163    def get_db_prep_save(self, value):
    163164        "Returns field's value prepared for saving into a database."
     165
     166
     167
     168
    164169        return value
    165170
    166171    def get_db_prep_lookup(self, lookup_type, value):
     
    528533    def get_db_prep_save(self, value):
    529534        # Casts dates into string format for entry into database.
    530535        if value is not None:
    531             # MySQL will throw a warning if microseconds are given, because it
    532             # doesn't support microseconds.
    533             if settings.DATABASE_ENGINE == 'mysql' and hasattr(value, 'microsecond'):
     536            # MySQL
     537            # microseconds.
     538            if settings.DATABASE_ENGINE and hasattr(value, 'microsecond'):
    534539                value = value.replace(microsecond=0)
    535540            value = str(value)
    536541        return Field.get_db_prep_save(self, value)
    537542
    538543    def get_db_prep_lookup(self, lookup_type, value):
     544
     545
     546
     547
    539548        if lookup_type == 'range':
    540549            value = [str(v) for v in value]
    541550        else:
     
    808817        Field.__init__(self, verbose_name, name, **kwargs)
    809818
    810819    def get_db_prep_lookup(self, lookup_type, value):
     820
     821
     822
     823
     824
     825
     826
     827
    811828        if lookup_type == 'range':
    812             value = [str(v) for v in value]
     829            value = [(v) for v in value]
    813830        else:
    814             value = str(value)
     831            value = (value)
    815832        return Field.get_db_prep_lookup(self, lookup_type, value)
    816833
    817834    def pre_save(self, model_instance, add):
     
    827844        if value is not None:
    828845            # MySQL will throw a warning if microseconds are given, because it
    829846            # doesn't support microseconds.
    830             if settings.DATABASE_ENGINE == 'mysql' and hasattr(value, 'microsecond'):
     847            if settings.DATABASE_ENGINE and hasattr(value, 'microsecond'):
    831848                value = value.replace(microsecond=0)
     849
     850
     851
     852
     853
     854
     855
    832856            value = str(value)
    833857        return Field.get_db_prep_save(self, value)
    834858
  • django/db/models/fields/related.py

     
    335335                    (target_col_name, self.join_table, source_col_name,
    336336                    target_col_name, ",".join(['%s'] * len(new_ids))),
    337337                    [self._pk_val] + list(new_ids))
    338                 if cursor.rowcount is not None and cursor.rowcount != 0:
    339                     existing_ids = set([row[0] for row in cursor.fetchmany(cursor.rowcount)])
    340                 else:
    341                     existing_ids = set()
     338                existing_ids = set([row[0] for row in cursor.fetchall()])
    342339
    343340                # Add the ones that aren't there already
    344341                for obj_id in (new_ids - existing_ids):
  • django/db/models/query.py

     
    44from django.db.models import signals
    55from django.dispatch import dispatcher
    66from django.utils.datastructures import SortedDict
     7
     8
    79import operator
    810import re
    911
     
    7779    else:
    7880        return backend.quote_name(word)
    7981
    80 class QuerySet(object):
     82class QuerySet(object):
    8183    "Represents a lazy database lookup for a set of objects"
    8284    def __init__(self, model=None):
    8385        self.model = model
     
    181183
    182184        cursor = connection.cursor()
    183185        cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
     186
    184187        fill_cache = self._select_related
    185         index_end = len(self.model._meta.fields)
     188        fields = self.model._meta.fields
     189        index_end = len(fields)
     190        has_resolve_columns = hasattr(self, 'resolve_columns')
    186191        while 1:
    187192            rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)
    188193            if not rows:
    189194                raise StopIteration
    190195            for row in rows:
     196
     197
    191198                if fill_cache:
    192199                    obj, index_end = get_cached_row(klass=self.model, row=row,
    193200                                                    index_start=0, max_depth=self._max_related_depth)
     
    551558
    552559        return select, " ".join(sql), params
    553560
     561
     562
     563
     564
     565
     566
    554567class ValuesQuerySet(QuerySet):
    555568    def __init__(self, *args, **kwargs):
    556569        super(ValuesQuerySet, self).__init__(*args, **kwargs)
     
    566579
    567580        # self._fields is a list of field names to fetch.
    568581        if self._fields:
    569             columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
    570             field_names = self._fields
     582            fields = [self.model._meta.get_field(f, many_to_many=False) for f in self._fields]
    571583        else: # Default to all fields.
    572             columns = [f.column for f in self.model._meta.fields]
    573             field_names = [f.attname for f in self.model._meta.fields]
     584            fields = self.model._meta.fields
     585        columns = [f.column for f in fields]
     586        field_names = [f.attname for f in fields]
    574587
    575588        select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns]
    576589        cursor = connection.cursor()
    577590        cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
     591
     592
    578593        while 1:
    579594            rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)
    580595            if not rows:
    581596                raise StopIteration
    582597            for row in rows:
     598
     599
    583600                yield dict(zip(field_names, row))
    584601
    585602    def _clone(self, klass=None, **kwargs):
     
    590607class DateQuerySet(QuerySet):
    591608    def iterator(self):
    592609        from django.db.backends.util import typecast_timestamp
     610
    593611        self._order_by = () # Clear this because it'll mess things up otherwise.
    594612        if self._field.null:
    595613            self._where.append('%s.%s IS NOT NULL' % \
    596614                (backend.quote_name(self.model._meta.db_table), backend.quote_name(self._field.column)))
    597 
    598615        try:
    599616            select, sql, params = self._get_sql_clause()
    600617        except EmptyResultSet:
    601618            raise StopIteration
    602619
    603         sql = 'SELECT %s %s GROUP BY 1 ORDER BY 1 %s' % \
     620        table_name = backend.quote_name(self.model._meta.db_table)
     621        field_name = backend.quote_name(self._field.column)
     622
     623        if backend.allows_group_by_ordinal:
     624            group_by = '1'
     625        else:
     626            group_by = backend.get_date_trunc_sql(self._kind,
     627                                                  '%s.%s' % (table_name, field_name))
     628
     629        sql = 'SELECT %s %s GROUP BY %s ORDER BY 1 %s' % \
    604630            (backend.get_date_trunc_sql(self._kind, '%s.%s' % (backend.quote_name(self.model._meta.db_table),
    605             backend.quote_name(self._field.column))), sql, self._order)
     631            backend.quote_name(self._field.column))), sql, self._order)
    606632        cursor = connection.cursor()
    607633        cursor.execute(sql, params)
    608         # We have to manually run typecast_timestamp(str()) on the results, because
    609         # MySQL doesn't automatically cast the result of date functions as datetime
    610         # objects -- MySQL returns the values as strings, instead.
    611         return [typecast_timestamp(str(row[0])) for row in cursor.fetchall()]
    612634
     635
     636
     637
     638
     639
     640
     641
     642
     643
     644
     645
     646
     647
     648
     649
     650
     651
     652
     653
    613654    def _clone(self, klass=None, **kwargs):
    614655        c = super(DateQuerySet, self)._clone(klass, **kwargs)
    615656        c._field = self._field
     
    716757    if table_prefix.endswith('.'):
    717758        table_prefix = backend.quote_name(table_prefix[:-1])+'.'
    718759    field_name = backend.quote_name(field_name)
     760
     761
     762
     763
     764
     765
     766
     767
    719768    try:
    720         return '%s%s %s' % (table_prefix, field_name, (backend.OPERATOR_MAPPING[lookup_type] % '%s'))
     769        return format % (table_prefix, field_name,
     770                         backend.OPERATOR_MAPPING[lookup_type] % cast_sql)
    721771    except KeyError:
    722772        pass
    723773    if lookup_type == 'in':
  • django/core/management.py

     
    5555
    5656def _get_installed_models(table_list):
    5757    "Gets a set of all models that are installed, given a list of existing tables"
    58     from django.db import models
     58    from django.db import models
    5959    all_models = []
    6060    for app in models.get_apps():
    6161        for model in models.get_models(app):
    6262            all_models.append(model)
    63     return set([m for m in all_models if m._meta.db_table in table_list])
     63    if backend.uses_case_insensitive_names:
     64        converter = str.upper
     65    else:
     66        converter = lambda x: x
     67    return set([m for m in all_models if converter(m._meta.db_table) in map(converter, table_list)])
    6468
    6569def _get_table_list():
    6670    "Gets a list of all db tables that are physically installed."
     
    104108def get_sql_create(app):
    105109    "Returns a list of the CREATE TABLE SQL statements for the given app."
    106110    from django.db import get_creation_module, models
     111
    107112    data_types = get_creation_module().DATA_TYPES
    108113
    109114    if not data_types:
     
    173178            rel_field = f
    174179            data_type = f.get_internal_type()
    175180        col_type = data_types[data_type]
     181
    176182        if col_type is not None:
    177183            # Make the definition (e.g. 'foo VARCHAR(30)') for this field.
    178184            field_output = [style.SQL_FIELD(backend.quote_name(f.column)),
    179185                style.SQL_COLTYPE(col_type % rel_field.__dict__)]
    180186            field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
    181             if f.unique:
     187            if f.unique:
    182188                field_output.append(style.SQL_KEYWORD('UNIQUE'))
    183189            if f.primary_key:
    184190                field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
     191
     192
     193
     194
    185195            if f.rel:
    186196                if f.rel.to in known_models:
    187197                    field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \
     
    205215    full_statement = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + style.SQL_TABLE(backend.quote_name(opts.db_table)) + ' (']
    206216    for i, line in enumerate(table_output): # Combine and add commas.
    207217        full_statement.append('    %s%s' % (line, i < len(table_output)-1 and ',' or ''))
    208     full_statement.append(');')
     218    full_statement.append(')')
     219    if opts.db_tablespace and backend.supports_tablespaces:
     220        full_statement.append(backend.get_tablespace_sql(opts.db_tablespace))
     221    full_statement.append(';')
    209222    final_output.append('\n'.join(full_statement))
    210223
     224
     225
     226
     227
     228
     229
     230
    211231    return final_output, pending_references
    212232
    213233def _get_sql_for_pending_references(model, pending_references):
     
    215235    Get any ALTER TABLE statements to add constraints after the fact.
    216236    """
    217237    from django.db import backend, get_creation_module
     238
    218239    data_types = get_creation_module().DATA_TYPES
    219240
    220241    final_output = []
     
    227248                r_col = f.column
    228249                table = opts.db_table
    229250                col = opts.get_field(f.rel.field_name).column
    230                 # For MySQL, r_name must be unique in the first 64 characters.
    231                 # So we are careful with character usage here.
    232                 r_name = '%s_refs_%s_%x' % (r_col, col, abs(hash((r_table, table))))
     251                r_name = '%s_refs_%s_%s_%s' % (r_col, col, r_table, table)
    233252                final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \
    234                     (backend.quote_name(r_table), r_name,
     253                    (backend.quote_name(r_table), ,
    235254                    backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col),
    236255                    backend.get_deferrable_sql()))
    237256            del pending_references[model]
     
    247266    final_output = []
    248267    for f in opts.many_to_many:
    249268        if not isinstance(f.rel, GenericRel):
     269
     270
     271
     272
     273
    250274            table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \
    251275                style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' (']
    252             table_output.append('    %s %s %s,' % \
     276            table_output.append('    %s %s %s,' % \
    253277                (style.SQL_FIELD(backend.quote_name('id')),
    254278                style.SQL_COLTYPE(data_types['AutoField']),
    255                 style.SQL_KEYWORD('NOT NULL PRIMARY KEY')))
     279                style.SQL_KEYWORD('NOT NULL PRIMARY KEY'),
     280                tablespace_sql))
    256281            table_output.append('    %s %s %s %s (%s)%s,' % \
    257282                (style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
    258283                style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__),
     
    267292                style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)),
    268293                style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)),
    269294                backend.get_deferrable_sql()))
    270             table_output.append('    %s (%s, %s)' % \
     295            table_output.append('    %s (%s, %s)' % \
    271296                (style.SQL_KEYWORD('UNIQUE'),
    272297                style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
    273                 style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name()))))
    274             table_output.append(');')
     298                style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())),
     299                tablespace_sql))
     300            table_output.append(')')
     301            if opts.db_tablespace and backend.supports_tablespaces:
     302                # f.db_tablespace is only for indices, so ignore its value here.
     303                table_output.append(backend.get_tablespace_sql(opts.db_tablespace))
     304            table_output.append(';')
    275305            final_output.append('\n'.join(table_output))
     306
     307
     308
     309
     310
     311
     312
    276313    return final_output
    277314
    278315def get_sql_delete(app):
    279316    "Returns a list of the DROP TABLE SQL statements for the given app."
    280317    from django.db import backend, connection, models, get_introspection_module
     318
    281319    introspection = get_introspection_module()
    282320
    283321    # This should work even if a connection isn't available
     
    291329        table_names = introspection.get_table_list(cursor)
    292330    else:
    293331        table_names = []
     332
     333
     334
     335
    294336
    295337    output = []
    296338
     
    300342    references_to_delete = {}
    301343    app_models = models.get_models(app)
    302344    for model in app_models:
    303         if cursor and model._meta.db_table in table_names:
     345        if cursor and in table_names:
    304346            # The table exists, so it needs to be dropped
    305347            opts = model._meta
    306348            for f in opts.fields:
     
    310352            to_delete.add(model)
    311353
    312354    for model in app_models:
    313         if cursor and model._meta.db_table in table_names:
     355        if cursor and in table_names:
    314356            # Drop the table now
    315357            output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
    316358                style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
     
    320362                    col = f.column
    321363                    r_table = model._meta.db_table
    322364                    r_col = model._meta.get_field(f.rel.field_name).column
     365
    323366                    output.append('%s %s %s %s;' % \
    324367                        (style.SQL_KEYWORD('ALTER TABLE'),
    325368                        style.SQL_TABLE(backend.quote_name(table)),
    326369                        style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()),
    327                         style.SQL_FIELD(backend.quote_name('%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table))))))))
     370                        style.SQL_FIELD()))))
    328371                del references_to_delete[model]
     372
     373
    329374
    330375    # Output DROP TABLE statements for many-to-many tables.
    331376    for model in app_models:
    332377        opts = model._meta
    333378        for f in opts.many_to_many:
    334             if cursor and f.m2m_db_table() in table_names:
     379            if cursor and ) in table_names:
    335380                output.append("%s %s;" % (style.SQL_KEYWORD('DROP TABLE'),
    336381                    style.SQL_TABLE(backend.quote_name(f.m2m_db_table()))))
     382
     383
    337384
     385
    338386    app_label = app_models[0]._meta.app_label
    339387
    340388    # Close database connection explicitly, in case this output is being piped
     
    429477def get_sql_indexes_for_model(model):
    430478    "Returns the CREATE INDEX SQL statements for a single model"
    431479    from django.db import backend
     480
    432481    output = []
    433482
    434483    for f in model._meta.fields:
    435         if f.db_index:
     484        if f.db_index:
    436485            unique = f.unique and 'UNIQUE ' or ''
     486
     487
     488
     489
     490
    437491            output.append(
    438492                style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
    439493                style.SQL_TABLE(backend.quote_name('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \
    440494                style.SQL_KEYWORD('ON') + ' ' + \
    441495                style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \
    442                 "(%s);" % style.SQL_FIELD(backend.quote_name(f.column))
     496                "(%s)" % style.SQL_FIELD(backend.quote_name(f.column)) + \
     497                "%s;" % tablespace_sql
    443498            )
    444499    return output
    445500
     
    463518
    464519def syncdb(verbosity=1, interactive=True):
    465520    "Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created."
    466     from django.db import connection, transaction, models, get_creation_module
     521    from django.db import connection, transaction, models, get_creation_module
    467522    from django.conf import settings
    468523
    469524    disable_termcolors()
     
    486541    # Get a list of all existing database tables,
    487542    # so we know what needs to be added.
    488543    table_list = _get_table_list()
     544
     545
     546
     547
    489548
    490549    # Get a list of already installed *models* so that references work right.
    491550    seen_models = _get_installed_models(table_list)
     
    500559            # Create the model's database table, if it doesn't already exist.
    501560            if verbosity >= 2:
    502561                print "Processing %s.%s model" % (app_name, model._meta.object_name)
    503             if model._meta.db_table in table_list:
     562            if in table_list:
    504563                continue
    505564            sql, references = _get_sql_model_create(model, seen_models)
    506565            seen_models.add(model)
     
    512571                print "Creating table %s" % model._meta.db_table
    513572            for statement in sql:
    514573                cursor.execute(statement)
    515             table_list.append(model._meta.db_table)
     574            table_list.append()
    516575
    517576    # Create the m2m tables. This must be done after all tables have been created
    518577    # to ensure that all referred tables will exist.
     
    830889        except NotImplementedError:
    831890            indexes = {}
    832891        for i, row in enumerate(introspection_module.get_table_description(cursor, table_name)):
    833             att_name = row[0]
     892            att_name = row[0]
    834893            comment_notes = [] # Holds Field notes, to be displayed in a Python comment.
    835894            extra_params = {}  # Holds Field parameters such as 'db_column'.
    836895
     
    16211680        if not mod_list:
    16221681            parser.print_usage_and_exit()
    16231682        if action not in NO_SQL_TRANSACTION:
    1624             print style.SQL_KEYWORD("BEGIN;")
     1683            from django.db import backend
     1684            if backend.get_start_transaction_sql():
     1685                print style.SQL_KEYWORD(backend.get_start_transaction_sql())
    16251686        for mod in mod_list:
    16261687            if action == 'reset':
    16271688                output = action_mapping[action](mod, options.interactive)
  • django/contrib/admin/models.py

     
    99
    1010class LogEntryManager(models.Manager):
    1111    def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''):
    12         e = self.model(None, None, user_id, content_type_id, object_id, object_repr[:200], action_flag, change_message)
     12        e = self.model(None, None, user_id, content_type_id, , object_repr[:200], action_flag, change_message)
    1313        e.save()
    1414
    1515class LogEntry(models.Model):
  • django/test/utils.py

     
    11import sys, time
    22from django.conf import settings
    3 from django.db import connection, transaction, backend
     3from django.db import connection,
    44from django.core import management
    55from django.dispatch import dispatcher
    66from django.test import signals
     
    4444        connection.connection.set_isolation_level(0)
    4545
    4646def create_test_db(verbosity=1, autoclobber=False):
     47
     48
     49
     50
     51
     52
    4753    if verbosity >= 1:
    4854        print "Creating test database..."
    4955    # If we're using SQLite, it's more convenient to test against an
     
    9298    cursor = connection.cursor()
    9399
    94100def destroy_test_db(old_database_name, verbosity=1):
     101
     102
     103
     104
     105
     106
    95107    # Unless we're using SQLite, remove the test database to clean up after
    96108    # ourselves. Connect to the previous database (not the test database)
    97109    # to do so, because it's not allowed to delete a database while being
  • docs/settings.txt

     
    245245Default: ``''`` (Empty string)
    246246
    247247Which database backend to use. Either ``'postgresql_psycopg2'``,
    248 ``'postgresql'``, ``'mysql'``,  ``'mysql_old'``, ``'sqlite3'`` or
    249 ``'ado_mssql'``.
     248``'postgresql'``, ``'mysql'``,  ``'mysql_old'``, ``'sqlite3'``
     249``'ado_mssql'``.
    250250
    251251DATABASE_HOST
    252252-------------
  • docs/faq.txt

     
    301301
    302302If you want to use Django with a database, which is probably the case, you'll
    303303also need a database engine. PostgreSQL_ is recommended, because we're
    304 PostgreSQL fans, and MySQL_ and `SQLite 3`_ are also supported.
     304PostgreSQL fans, and MySQL__ are also supported.
    305305
    306306.. _Python: http://www.python.org/
    307307.. _Apache 2: http://httpd.apache.org/
     
    310310.. _PostgreSQL: http://www.postgresql.org/
    311311.. _MySQL: http://www.mysql.com/
    312312.. _`SQLite 3`: http://www.sqlite.org/
     313
    313314
    314315Do I lose anything by using Python 2.3 versus newer Python versions, such as Python 2.5?
    315316----------------------------------------------------------------------------------------
  • docs/install.txt

     
    6262
    6363* If you're using SQLite, you'll need pysqlite_. Use version 2.0.3 or higher.
    6464
     65
     66
    6567.. _PostgreSQL: http://www.postgresql.org/
    6668.. _MySQL: http://www.mysql.com/
    6769.. _Django's ticket system: http://code.djangoproject.com/report/1
     
    7173.. _SQLite: http://www.sqlite.org/
    7274.. _pysqlite: http://initd.org/tracker/pysqlite
    7375.. _MySQL backend: ../databases/
     76
    7477
    7578Remove any old versions of Django
    7679=================================
  • tests/modeltests/datatypes/models.py

    Property changes on: tests/modeltests/datatypes
    ___________________________________________________________________
    Name: svn:ignore
       + *.pyc
    
    
    
    Property changes on: tests/modeltests/datatypes/__init__.py
    ___________________________________________________________________
    Name: svn:eol-style
       + native
    
     
     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
Back to Top