Changeset 5967
- Timestamp:
- 08/19/07 20:03:33 (1 year ago)
- Files:
-
- django/trunk/django/contrib/auth/models.py (modified) (3 diffs)
- django/trunk/django/contrib/contenttypes/generic.py (modified) (2 diffs)
- django/trunk/django/core/management/commands/createcachetable.py (modified) (3 diffs)
- django/trunk/django/core/management/sql.py (modified) (15 diffs)
- django/trunk/django/db/backends/ado_mssql/base.py (modified) (2 diffs)
- django/trunk/django/db/backends/dummy/base.py (modified) (1 diff)
- django/trunk/django/db/backends/__init__.py (modified) (1 diff)
- django/trunk/django/db/backends/mysql/base.py (modified) (4 diffs)
- django/trunk/django/db/backends/mysql/introspection.py (modified) (1 diff)
- django/trunk/django/db/backends/mysql_old/base.py (modified) (4 diffs)
- django/trunk/django/db/backends/mysql_old/introspection.py (modified) (1 diff)
- django/trunk/django/db/backends/oracle/base.py (modified) (11 diffs)
- django/trunk/django/db/backends/oracle/introspection.py (modified) (1 diff)
- django/trunk/django/db/backends/postgresql/base.py (modified) (8 diffs)
- django/trunk/django/db/backends/postgresql/introspection.py (modified) (1 diff)
- django/trunk/django/db/backends/postgresql_psycopg2/base.py (modified) (8 diffs)
- django/trunk/django/db/backends/postgresql_psycopg2/introspection.py (modified) (1 diff)
- django/trunk/django/db/backends/sqlite3/base.py (modified) (3 diffs)
- django/trunk/django/db/backends/sqlite3/introspection.py (modified) (1 diff)
- django/trunk/django/db/models/base.py (modified) (9 diffs)
- django/trunk/django/db/models/fields/related.py (modified) (6 diffs)
- django/trunk/django/db/models/query.py (modified) (16 diffs)
- django/trunk/django/test/utils.py (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/contrib/auth/models.py
r5803 r5967 1 1 from django.core import validators 2 2 from django.core.exceptions import ImproperlyConfigured 3 from django.db import backend,connection, models3 from django.db import connection, models 4 4 from django.contrib.contenttypes.models import ContentType 5 5 from django.utils.encoding import smart_str … … 204 204 # AND ct."id" = p."content_type_id" 205 205 # AND ug."user_id" = %s, [self.id]) 206 qn = connection.ops.quote_name 206 207 sql = """ 207 208 SELECT ct.%s, p.%s … … 211 212 AND ct.%s = p.%s 212 213 AND ug.%s = %%s""" % ( 213 backend.quote_name('app_label'), backend.quote_name('codename'),214 backend.quote_name('auth_permission'), backend.quote_name('auth_group_permissions'),215 backend.quote_name('auth_user_groups'), backend.quote_name('django_content_type'),216 backend.quote_name('id'), backend.quote_name('permission_id'),217 backend.quote_name('group_id'), backend.quote_name('group_id'),218 backend.quote_name('id'), backend.quote_name('content_type_id'),219 backend.quote_name('user_id'),)214 qn('app_label'), qn('codename'), 215 qn('auth_permission'), qn('auth_group_permissions'), 216 qn('auth_user_groups'), qn('django_content_type'), 217 qn('id'), qn('permission_id'), 218 qn('group_id'), qn('group_id'), 219 qn('id'), qn('content_type_id'), 220 qn('user_id'),) 220 221 cursor.execute(sql, [self.id]) 221 222 self._group_perm_cache = set(["%s.%s" % (row[0], row[1]) for row in cursor.fetchall()]) django/trunk/django/contrib/contenttypes/generic.py
r5609 r5967 5 5 from django import oldforms 6 6 from django.core.exceptions import ObjectDoesNotExist 7 from django.db import backend7 from django.db import connection 8 8 from django.db.models import signals 9 9 from django.db.models.fields.related import RelatedField, Field, ManyToManyRel … … 164 164 RelatedManager = create_generic_related_manager(superclass) 165 165 166 qn = connection.ops.quote_name 167 166 168 manager = RelatedManager( 167 169 model = rel_model, 168 170 instance = instance, 169 171 symmetrical = (self.field.rel.symmetrical and instance.__class__ == rel_model), 170 join_table = backend.quote_name(self.field.m2m_db_table()),171 source_col_name = backend.quote_name(self.field.m2m_column_name()),172 target_col_name = backend.quote_name(self.field.m2m_reverse_name()),172 join_table = qn(self.field.m2m_db_table()), 173 source_col_name = qn(self.field.m2m_column_name()), 174 target_col_name = qn(self.field.m2m_reverse_name()), 173 175 content_type = ContentType.objects.get_for_model(self.field.model), 174 176 content_type_field_name = self.field.content_type_field_name, django/trunk/django/core/management/commands/createcachetable.py
r5903 r5967 9 9 10 10 def handle_label(self, tablename, **options): 11 from django.db import backend,connection, transaction, models11 from django.db import connection, transaction, models 12 12 fields = ( 13 13 # "key" is a reserved word in MySQL, so use "cache_key" instead. … … 18 18 table_output = [] 19 19 index_output = [] 20 qn = connection.ops.quote_name 20 21 for f in fields: 21 field_output = [ backend.quote_name(f.name), f.db_type()]22 field_output = [qn(f.name), f.db_type()] 22 23 field_output.append("%sNULL" % (not f.null and "NOT " or "")) 23 24 if f.unique: … … 28 29 unique = f.unique and "UNIQUE " or "" 29 30 index_output.append("CREATE %sINDEX %s_%s ON %s (%s);" % \ 30 (unique, tablename, f.name, backend.quote_name(tablename),31 backend.quote_name(f.name)))31 (unique, tablename, f.name, qn(tablename), 32 qn(f.name))) 32 33 table_output.append(" ".join(field_output)) 33 full_statement = ["CREATE TABLE %s (" % backend.quote_name(tablename)]34 full_statement = ["CREATE TABLE %s (" % qn(tablename)] 34 35 for i, line in enumerate(table_output): 35 36 full_statement.append(' %s%s' % (line, i < len(table_output)-1 and ',' or '')) django/trunk/django/core/management/sql.py
r5966 r5967 117 117 118 118 output = [] 119 qn = connection.ops.quote_name 119 120 120 121 # Output DROP TABLE statements for standard application tables. … … 137 138 # Drop the table now 138 139 output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'), 139 style.SQL_TABLE( backend.quote_name(model._meta.db_table))))140 style.SQL_TABLE(qn(model._meta.db_table)))) 140 141 if backend.supports_constraints and model in references_to_delete: 141 142 for rel_class, f in references_to_delete[model]: … … 147 148 output.append('%s %s %s %s;' % \ 148 149 (style.SQL_KEYWORD('ALTER TABLE'), 149 style.SQL_TABLE( backend.quote_name(table)),150 style.SQL_TABLE(qn(table)), 150 151 style.SQL_KEYWORD(connection.ops.drop_foreignkey_sql()), 151 152 style.SQL_FIELD(truncate_name(r_name, connection.ops.max_name_length())))) … … 160 161 if cursor and table_name_converter(f.m2m_db_table()) in table_names: 161 162 output.append("%s %s;" % (style.SQL_KEYWORD('DROP TABLE'), 162 style.SQL_TABLE( backend.quote_name(f.m2m_db_table()))))163 style.SQL_TABLE(qn(f.m2m_db_table())))) 163 164 if hasattr(backend, 'get_drop_sequence'): 164 165 output.append(backend.get_drop_sequence("%s_%s" % (model._meta.db_table, f.column))) … … 220 221 table_output = [] 221 222 pending_references = {} 223 qn = connection.ops.quote_name 222 224 for f in opts.fields: 223 225 col_type = f.db_type() … … 228 230 continue 229 231 # Make the definition (e.g. 'foo VARCHAR(30)') for this field. 230 field_output = [style.SQL_FIELD( backend.quote_name(f.column)),232 field_output = [style.SQL_FIELD(qn(f.column)), 231 233 style.SQL_COLTYPE(col_type)] 232 234 field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or ''))) … … 242 244 if f.rel.to in known_models: 243 245 field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \ 244 style.SQL_TABLE( backend.quote_name(f.rel.to._meta.db_table)) + ' (' + \245 style.SQL_FIELD( backend.quote_name(f.rel.to._meta.get_field(f.rel.field_name).column)) + ')' +246 style.SQL_TABLE(qn(f.rel.to._meta.db_table)) + ' (' + \ 247 style.SQL_FIELD(qn(f.rel.to._meta.get_field(f.rel.field_name).column)) + ')' + 246 248 connection.ops.deferrable_sql() 247 249 ) … … 252 254 table_output.append(' '.join(field_output)) 253 255 if opts.order_with_respect_to: 254 table_output.append(style.SQL_FIELD( backend.quote_name('_order')) + ' ' + \256 table_output.append(style.SQL_FIELD(qn('_order')) + ' ' + \ 255 257 style.SQL_COLTYPE(models.IntegerField().db_type()) + ' ' + \ 256 258 style.SQL_KEYWORD('NULL')) 257 259 for field_constraints in opts.unique_together: 258 260 table_output.append(style.SQL_KEYWORD('UNIQUE') + ' (%s)' % \ 259 ", ".join([ backend.quote_name(style.SQL_FIELD(opts.get_field(f).column)) for f in field_constraints]))260 261 full_statement = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + style.SQL_TABLE( backend.quote_name(opts.db_table)) + ' (']261 ", ".join([qn(style.SQL_FIELD(opts.get_field(f).column)) for f in field_constraints])) 262 263 full_statement = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + style.SQL_TABLE(qn(opts.db_table)) + ' ('] 262 264 for i, line in enumerate(table_output): # Combine and add commas. 263 265 full_statement.append(' %s%s' % (line, i < len(table_output)-1 and ',' or '')) … … 284 286 from django.db.backends.util import truncate_name 285 287 288 qn = connection.ops.quote_name 286 289 final_output = [] 287 290 if backend.supports_constraints: … … 298 301 r_name = '%s_refs_%s_%x' % (r_col, col, abs(hash((r_table, table)))) 299 302 final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \ 300 ( backend.quote_name(r_table), truncate_name(r_name, connection.ops.max_name_length()),301 backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col),303 (qn(r_table), truncate_name(r_name, connection.ops.max_name_length()), 304 qn(r_col), qn(table), qn(col), 302 305 connection.ops.deferrable_sql())) 303 306 del pending_references[model] … … 310 313 opts = model._meta 311 314 final_output = [] 315 qn = connection.ops.quote_name 312 316 for f in opts.many_to_many: 313 317 if not isinstance(f.rel, generic.GenericRel): … … 318 322 tablespace_sql = '' 319 323 table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \ 320 style.SQL_TABLE( backend.quote_name(f.m2m_db_table())) + ' (']324 style.SQL_TABLE(qn(f.m2m_db_table())) + ' ('] 321 325 table_output.append(' %s %s %s%s,' % \ 322 (style.SQL_FIELD( backend.quote_name('id')),326 (style.SQL_FIELD(qn('id')), 323 327 style.SQL_COLTYPE(models.AutoField(primary_key=True).db_type()), 324 328 style.SQL_KEYWORD('NOT NULL PRIMARY KEY'), 325 329 tablespace_sql)) 326 330 table_output.append(' %s %s %s %s (%s)%s,' % \ 327 (style.SQL_FIELD( backend.quote_name(f.m2m_column_name())),331 (style.SQL_FIELD(qn(f.m2m_column_name())), 328 332 style.SQL_COLTYPE(models.ForeignKey(model).db_type()), 329 333 style.SQL_KEYWORD('NOT NULL REFERENCES'), 330 style.SQL_TABLE( backend.quote_name(opts.db_table)),331 style.SQL_FIELD( backend.quote_name(opts.pk.column)),334 style.SQL_TABLE(qn(opts.db_table)), 335 style.SQL_FIELD(qn(opts.pk.column)), 332 336 connection.ops.deferrable_sql())) 333 337 table_output.append(' %s %s %s %s (%s)%s,' % \ 334 (style.SQL_FIELD( backend.quote_name(f.m2m_reverse_name())),338 (style.SQL_FIELD(qn(f.m2m_reverse_name())), 335 339 style.SQL_COLTYPE(models.ForeignKey(f.rel.to).db_type()), 336 340 style.SQL_KEYWORD('NOT NULL REFERENCES'), 337 style.SQL_TABLE( backend.quote_name(f.rel.to._meta.db_table)),338 style.SQL_FIELD( backend.quote_name(f.rel.to._meta.pk.column)),341 style.SQL_TABLE(qn(f.rel.to._meta.db_table)), 342 style.SQL_FIELD(qn(f.rel.to._meta.pk.column)), 339 343 connection.ops.deferrable_sql())) 340 344 table_output.append(' %s (%s, %s)%s' % \ 341 345 (style.SQL_KEYWORD('UNIQUE'), 342 style.SQL_FIELD( backend.quote_name(f.m2m_column_name())),343 style.SQL_FIELD( backend.quote_name(f.m2m_reverse_name())),346 style.SQL_FIELD(qn(f.m2m_column_name())), 347 style.SQL_FIELD(qn(f.m2m_reverse_name())), 344 348 tablespace_sql)) 345 349 table_output.append(')') … … 351 355 352 356 # Add any extra SQL needed to support auto-incrementing PKs 353 autoinc_sql = backend.get_autoinc_sql(f.m2m_db_table())357 autoinc_sql = connection.ops.autoinc_sql(f.m2m_db_table()) 354 358 if autoinc_sql: 355 359 for stmt in autoinc_sql: … … 390 394 output = [] 391 395 396 qn = connection.ops.quote_name 392 397 for f in model._meta.fields: 393 398 if f.db_index and not ((f.primary_key or f.unique) and backend.autoindexes_primary_keys): … … 400 405 output.append( 401 406 style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \ 402 style.SQL_TABLE( backend.quote_name('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \407 style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \ 403 408 style.SQL_KEYWORD('ON') + ' ' + \ 404 style.SQL_TABLE( backend.quote_name(model._meta.db_table)) + ' ' + \405 "(%s)" % style.SQL_FIELD( backend.quote_name(f.column)) + \409 style.SQL_TABLE(qn(model._meta.db_table)) + ' ' + \ 410 "(%s)" % style.SQL_FIELD(qn(f.column)) + \ 406 411 "%s;" % tablespace_sql 407 412 ) django/trunk/django/db/backends/ado_mssql/base.py
r5966 r5967 68 68 return cursor.fetchone()[0] 69 69 70 def quote_name(self, name): 71 if name.startswith('[') and name.endswith(']'): 72 return name # Quoting once is enough. 73 return '[%s]' % name 74 70 75 def random_function_sql(self): 71 76 return 'RAND()' 72 77 73 78 def tablespace_sql(self, tablespace, inline=False): 74 return "ON %s" % quote_name(tablespace)79 return "ON %s" % self.quote_name(tablespace) 75 80 76 81 class DatabaseWrapper(BaseDatabaseWrapper): … … 98 103 uses_case_insensitive_names = False 99 104 100 def quote_name(name):101 if name.startswith('[') and name.endswith(']'):102 return name # Quoting once is enough.103 return '[%s]' % name104 105 105 dictfetchone = util.dictfetchone 106 106 dictfetchmany = util.dictfetchmany django/trunk/django/db/backends/dummy/base.py
r5965 r5967 40 40 supports_constraints = False 41 41 supports_tablespaces = False 42 quote_name = complain43 42 dictfetchone = complain 44 43 dictfetchmany = complain django/trunk/django/db/backends/__init__.py
r5966 r5967 135 135 return 'DEFAULT' 136 136 137 def quote_name(self, name): 138 """ 139 Returns a quoted version of the given table, index or column name. Does 140 not quote the given name if it's already been quoted. 141 """ 142 raise NotImplementedError() 143 137 144 def random_function_sql(self): 138 145 """ django/trunk/django/db/backends/mysql/base.py
r5965 r5967 85 85 return sql + str(limit) 86 86 87 def quote_name(self, name): 88 if name.startswith("`") and name.endswith("`"): 89 return name # Quoting once is enough. 90 return "`%s`" % name 91 87 92 def random_function_sql(self): 88 93 return 'RAND()' … … 95 100 sql = ['SET FOREIGN_KEY_CHECKS = 0;'] 96 101 for table in tables: 97 sql.append('%s %s;' % (style.SQL_KEYWORD('TRUNCATE'), style.SQL_FIELD( quote_name(table))))102 sql.append('%s %s;' % (style.SQL_KEYWORD('TRUNCATE'), style.SQL_FIELD(self.quote_name(table)))) 98 103 sql.append('SET FOREIGN_KEY_CHECKS = 1;') 99 104 … … 103 108 (style.SQL_KEYWORD('ALTER'), 104 109 style.SQL_KEYWORD('TABLE'), 105 style.SQL_TABLE( quote_name(sequence['table'])),110 style.SQL_TABLE(self.quote_name(sequence['table'])), 106 111 style.SQL_KEYWORD('AUTO_INCREMENT'), 107 112 style.SQL_FIELD('= 1'), … … 180 185 uses_case_insensitive_names = False 181 186 182 def quote_name(name):183 if name.startswith("`") and name.endswith("`"):184 return name # Quoting once is enough.185 return "`%s`" % name186 187 187 dictfetchone = util.dictfetchone 188 188 dictfetchmany = util.dictfetchmany django/trunk/django/db/backends/mysql/introspection.py
r5302 r5967 1 from django.db.backends.mysql.base import quote_name1 from django.db.backends.mysql.base import DatabaseOperations 2 2 from MySQLdb import ProgrammingError, OperationalError 3 3 from MySQLdb.constants import FIELD_TYPE 4 4 import re 5 5 6 quote_name = DatabaseOperations().quote_name 6 7 foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)") 7 8 django/trunk/django/db/backends/mysql_old/base.py
r5965 r5967 95 95 return sql + str(limit) 96 96 97 def quote_name(self, name): 98 if name.startswith("`") and name.endswith("`"): 99 return name # Quoting once is enough. 100 return "`%s`" % name 101 97 102 def random_function_sql(self): 98 103 return 'RAND()' … … 105 110 sql = ['SET FOREIGN_KEY_CHECKS = 0;'] 106 111 for table in tables: 107 sql.append('%s %s;' % (style.SQL_KEYWORD('TRUNCATE'), style.SQL_FIELD( quote_name(table))))112 sql.append('%s %s;' % (style.SQL_KEYWORD('TRUNCATE'), style.SQL_FIELD(self.quote_name(table)))) 108 113 sql.append('SET FOREIGN_KEY_CHECKS = 1;') 109 114 … … 113 118 (style.SQL_KEYWORD('ALTER'), 114 119 style.SQL_KEYWORD('TABLE'), 115 style.SQL_TABLE( quote_name(sequence['table'])),120 style.SQL_TABLE(self.quote_name(sequence['table'])), 116 121 style.SQL_KEYWORD('AUTO_INCREMENT'), 117 122 style.SQL_FIELD('= 1'), … … 199 204 uses_case_insensitive_names = False 200 205 201 def quote_name(name):202 if name.startswith("`") and name.endswith("`"):203 return name # Quoting once is enough.204 return "`%s`" % name205 206 206 dictfetchone = util.dictfetchone 207 207 dictfetchmany = util.dictfetchmany django/trunk/django/db/backends/mysql_old/introspection.py
r5876 r5967 1 from django.db.backends.mysql_old.base import quote_name1 from django.db.backends.mysql_old.base import DatabaseOperations 2 2 from MySQLdb import ProgrammingError, OperationalError 3 3 from MySQLdb.constants import FIELD_TYPE 4 4 import re 5 5 6 quote_name = DatabaseOperations().quote_name 6 7 foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)") 7 8 django/trunk/django/db/backends/oracle/base.py
r5966 r5967 36 36 BEGIN 37 37 SELECT %s.nextval INTO :new.id FROM dual; 38 END;/""" % (tr_name, quote_name(table), sq_name)38 END;/""" % (tr_name, self.quote_name(table), sq_name) 39 39 return sequence_sql, trigger_sql 40 40 … … 70 70 def max_name_length(self): 71 71 return 30 72 73 def quote_name(self, name): 74 # SQL92 requires delimited (quoted) names to be case-sensitive. When 75 # not quoted, Oracle has case-insensitive behavior for identifiers, but 76 # always defaults to uppercase. 77 # We simplify things by making Oracle identifiers always uppercase. 78 if not name.startswith('"') and not name.endswith('"'): 79 name = '"%s"' % util.truncate_name(name.upper(), DatabaseOperations().max_name_length()) 80 return name.upper() 72 81 73 82 def random_function_sql(self): … … 83 92 (style.SQL_KEYWORD('DELETE'), 84 93 style.SQL_KEYWORD('FROM'), 85 style.SQL_FIELD( quote_name(table))94 style.SQL_FIELD(self.quote_name(table)) 86 95 ) for table in tables] 87 96 # Since we've just deleted all the rows, running our sequence … … 90 99 table_name = sequence_info['table'] 91 100 seq_name = get_sequence_name(table_name) 92 query = _get_sequence_reset_sql() % {'sequence': seq_name, 'table':quote_name(table_name)}101 query = _get_sequence_reset_sql() % {'sequence': seq_name, 'table': self.quote_name(table_name)} 93 102 sql.append(query) 94 103 return sql … … 117 126 118 127 def tablespace_sql(self, tablespace, inline=False): 119 return "%sTABLESPACE %s" % ((inline and "USING INDEX " or ""), quote_name(tablespace))128 return "%sTABLESPACE %s" % ((inline and "USING INDEX " or ""), self.quote_name(tablespace)) 120 129 121 130 class DatabaseWrapper(BaseDatabaseWrapper): … … 216 225 return s 217 226 218 def quote_name(name):219 # SQL92 requires delimited (quoted) names to be case-sensitive. When220 # not quoted, Oracle has case-insensitive behavior for identifiers, but221 # always defaults to uppercase.222 # We simplify things by making Oracle identifiers always uppercase.223 if not name.startswith('"') and not name.endswith('"'):224 name = '"%s"' % util.truncate_name(name.upper(), DatabaseOperations().max_name_length())225 return name.upper()226 227 227 dictfetchone = util.dictfetchone 228 228 dictfetchmany = util.dictfetchmany … … 236 236 237 237 def get_drop_sequence(table): 238 return "DROP SEQUENCE %s;" % quote_name(get_sequence_name(table))238 return "DROP SEQUENCE %s;" % DatabaseOperations().quote_name(get_sequence_name(table)) 239 239 240 240 def _get_sequence_reset_sql(): … … 329 329 330 330 opts = self.model._meta 331 qn = connection.ops.quote_name 331 332 332 333 # Construct the fundamental parts of the query: SELECT X FROM Y WHERE Z. 333 select = ["%s.%s" % ( backend.quote_name(opts.db_table), backend.quote_name(f.column)) for f in opts.fields]334 select = ["%s.%s" % (qn(opts.db_table), qn(f.column)) for f in opts.fields] 334 335 tables = [quote_only_if_word(t) for t in self._tables] 335 336 joins = SortedDict() … … 349 350 # Add any additional SELECTs. 350 351 if self._select: 351 select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()])352 select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), qn(s[0])) for s in self._select.items()]) 352 353 353 354 # Start composing the body of the SQL statement. 354 sql = [" FROM", backend.quote_name(opts.db_table)]355 sql = [" FROM", qn(opts.db_table)] 355 356 356 357 # Compose the join dictionary into SQL describing the joins. … … 385 386 if "." in col_name: 386 387 table_prefix, col_name = col_name.split('.', 1) 387 table_prefix = backend.quote_name(table_prefix) + '.'388 table_prefix = qn(table_prefix) + '.' 388 389 else: 389 390 # Use the database table as a column prefix if it wasn't given, 390 391 # and if the requested column isn't a custom SELECT. 391 392 if "." not in col_name and col_name not in (self._select or ()): 392 table_prefix = backend.quote_name(opts.db_table) + '.'393 table_prefix = qn(opts.db_table) + '.' 393 394 else: 394 395 table_prefix = '' 395 order_by.append('%s%s %s' % (table_prefix, backend.quote_name(orderfield2column(col_name, opts)), order))396 order_by.append('%s%s %s' % (table_prefix, qn(orderfield2column(col_name, opts)), order)) 396 397 if order_by: 397 398 sql.append("ORDER BY " + ", ".join(order_by)) … … 418 419 #So we need to define a default order-by, since none was provided. 419 420 order_by_clause = " OVER (ORDER BY %s.%s)" % \ 420 (backend.quote_name(opts.db_table), 421 backend.quote_name(opts.fields[0].db_column or opts.fields[0].column)) 421 (qn(opts.db_table), qn(opts.fields[0].db_column or opts.fields[0].column)) 422 422 # limit_and_offset_clause 423 423 if self._limit is None: django/trunk/django/db/backends/oracle/introspection.py
r5519 r5967 1 from django.db.backends.oracle.base import quote_name1 from django.db.backends.oracle.base import DatabaseOperations 2 2 import re 3 3 import cx_Oracle 4 4 5 5 quote_name = DatabaseOperations().quote_name 6 6 foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)") 7 7 django/trunk/django/db/backends/postgresql/base.py
r5965 r5967 74 74 return cursor.fetchone()[0] 75 75 76 def quote_name(self, name): 77 if name.startswith('"') and name.endswith('"'): 78 return name # Quoting once is enough. 79 return '"%s"' % name 80 76 81 def sql_flush(self, style, tables, sequences): 77 82 if tables: … … 83 88 sql = ['%s %s;' % \ 84 89 (style.SQL_KEYWORD('TRUNCATE'), 85 style.SQL_FIELD(', '.join([ quote_name(table) for table in tables]))90 style.SQL_FIELD(', '.join([self.quote_name(table) for table in tables])) 86 91 )] 87 92 else: … … 91 96 (style.SQL_KEYWORD('DELETE'), 92 97 style.SQL_KEYWORD('FROM'), 93 style.SQL_FIELD( quote_name(table))98 style.SQL_FIELD(self.quote_name(table)) 94 99 ) for table in tables] 95 100 … … 104 109 (style.SQL_KEYWORD('ALTER'), 105 110 style.SQL_KEYWORD('SEQUENCE'), 106 style.SQL_FIELD( quote_name('%s_%s_seq' % (table_name, column_name))),111 style.SQL_FIELD(self.quote_name('%s_%s_seq' % (table_name, column_name))), 107 112 style.SQL_KEYWORD('RESTART'), 108 113 style.SQL_KEYWORD('WITH'), … … 115 120 (style.SQL_KEYWORD('ALTER'), 116 121 style.SQL_KEYWORD('SEQUENCE'), 117 style.SQL_FIELD( quote_name('%s_id_seq' % table_name)),122 style.SQL_FIELD(self.quote_name('%s_id_seq' % table_name)), 118 123 style.SQL_KEYWORD('RESTART'), 119 124 style.SQL_KEYWORD('WITH'), … … 128 133 from django.db import models 129 134 output = [] 135 qn = self.quote_name 130 136 for model in model_list: 131 137 # Use `coalesce` to set the sequence for each model to the max pk value if there are records, … … 136 142 output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \ 137 143 (style.SQL_KEYWORD('SELECT'), 138 style.SQL_FIELD(q uote_name('%s_%s_seq' % (model._meta.db_table, f.column))),139 style.SQL_FIELD(q uote_name(f.column)),140 style.SQL_FIELD(q uote_name(f.column)),144 style.SQL_FIELD(qn('%s_%s_seq' % (model._meta.db_table, f.column))), 145 style.SQL_FIELD(qn(f.column)), 146 style.SQL_FIELD(qn(f.column)), 141 147 style.SQL_KEYWORD('IS NOT'), 142 148 style.SQL_KEYWORD('FROM'), 143 style.SQL_TABLE(q uote_name(model._meta.db_table))))149 style.SQL_TABLE(qn(model._meta.db_table)))) 144 150 break # Only one AutoField is allowed per model, so don't bother continuing. 145 151 for f in model._meta.many_to_many: 146 152 output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \ 147 153 (style.SQL_KEYWORD('SELECT'), 148 style.SQL_FIELD(q uote_name('%s_id_seq' % f.m2m_db_table())),149 style.SQL_FIELD(q uote_name('id')),150 style.SQL_FIELD(q uote_name('id')),154 style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table())), 155 style.SQL_FIELD(qn('id')), 156 style.SQL_FIELD(qn('id')), 151 157 style.SQL_KEYWORD('IS NOT'), 152 158 style.SQL_KEYWORD('FROM'), … … 195 201 uses_case_insensitive_names = False 196 202 197 def quote_name(name):198 if name.startswith('"') and name.endswith('"'):199 return name # Quoting once is enough.200 return '"%s"' % name201 202 203 def dictfetchone(cursor): 203 204 "Returns a row from the cursor as a dict" django/trunk/django/db/backends/postgresql/introspection.py
r5302 r5967 1 from django.db.backends.postgresql.base import quote_name 1 from django.db.backends.postgresql.base import DatabaseOperations 2 3 quote_name = DatabaseOperations().quote_name 2 4 3 5 def get_table_list(cursor): django/trunk/django/db/backends/postgresql_psycopg2/base.py
r5965 r5967 36 36 return cursor.fetchone()[0] 37 37 38 def quote_name(self, name): 39 if name.startswith('"') and name.endswith('"'): 40 return name # Quoting once is enough. 41 return '"%s"' % name 42 38 43 def sql_flush(self, style, tables, sequences): 44 qn = self.quote_name 39 45 if tables: 40 46 if postgres_version[0] >= 8 and postgres_version[1] >= 1: … … 45 51 sql = ['%s %s;' % \ 46 52 (style.SQL_KEYWORD('TRUNCATE'), 47 style.SQL_FIELD(', '.join([q uote_name(table) for table in tables]))53 style.SQL_FIELD(', '.join([qn(table) for table in tables])) 48 54 )] 49 55 else: … … 53 59 (style.SQL_KEYWORD('DELETE'), 54 60 style.SQL_KEYWORD('FROM'), 55 style.SQL_FIELD(q uote_name(table))61 style.SQL_FIELD(qn(table)) 56 62 ) for table in tables] 57 63 … … 66 72 (style.SQL_KEYWORD('ALTER'), 67 73 style.SQL_KEYWORD('SEQUENCE'), 68 style.SQL_FIELD(q uote_name('%s_%s_seq' % (table_name, column_name))),74 style.SQL_FIELD(qn('%s_%s_seq' % (table_name, column_name))), 69 75 style.SQL_KEYWORD('RESTART'), 70 76 style.SQL_KEYWORD('WITH'), … … 77 83 (style.SQL_KEYWORD('ALTER'), 78 84 style.SQL_KEYWORD('SEQUENCE'), 79 style.SQL_FIELD(q uote_name('%s_id_seq' % table_name)),85 style.SQL_FIELD(qn('%s_id_seq' % table_name)), 80 86 style.SQL_KEYWORD('RESTART'), 81 87 style.SQL_KEYWORD('WITH'), … … 89 95 def sequence_reset_sql(self, style, model_list): 90 96 from django.db import models 97 qn = self.quote_name 91 98 output = [] 92 99 for model in model_list: … … 98 105 output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \ 99 106 (style.SQL_KEYWORD('SELECT'), 100 style.SQL_FIELD(q uote_name('%s_%s_seq' % (model._meta.db_table, f.column))),101 style.SQL_FIELD(q uote_name(f.column)),102 style.SQL_FIELD(q uote_name(f.column)),107 style.SQL_FIELD(qn('%s_%s_seq' % (model._meta.db_table, f.column))), 108 style.SQL_FIELD(qn(f.column)), 109 style.SQL_FIELD(qn(f.column)), 103 110 style.SQL_KEYWORD('IS NOT'), 104 111 style.SQL_KEYWORD('FROM'), 105 style.SQL_TABLE(q uote_name(model._meta.db_table))))112 style.SQL_TABLE(qn(model._meta.db_table)))) 106 113 break # Only one AutoField is allowed per model, so don't bother continuing. 107 114 for f in model._meta.many_to_many: 108 115 output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \ 109 116 (style.SQL_KEYWORD('SELECT'), 110 style.SQL_FIELD(q uote_name('%s_id_seq' % f.m2m_db_table())),111 style.SQL_FIELD(q uote_name('id')),112 style.SQL_FIELD(q uote_name('id')),117 style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table())), 118 style.SQL_FIELD(qn('id')), 119 style.SQL_FIELD(qn('id')), 113 120 style.SQL_KEYWORD('IS NOT'), 114 121 style.SQL_KEYWORD('FROM'), … … 157 164 uses_case_insensitive_names = False 158 165 159 def quote_name(name):160 if name.startswith('"') and name.endswith('"'):161 return name # Quoting once is enough.162 return '"%s"' % name
