Loading django/db/models/sql/compiler.py +25 −19 Original line number Diff line number Diff line import datetime import warnings from django.conf import settings from django.core.exceptions import FieldError Loading @@ -12,8 +13,9 @@ from django.db.models.sql.query import get_order_dir, Query from django.db.transaction import TransactionManagementError from django.db.utils import DatabaseError from django.utils import six from django.utils.six.moves import zip from django.utils import timezone from django.utils.deprecation import RemovedInDjango20Warning from django.utils.six.moves import zip class SQLCompiler(object): Loading Loading @@ -46,6 +48,17 @@ class SQLCompiler(object): self.fill_related_selections() def __call__(self, name): """ Backwards-compatibility shim so that calling a SQLCompiler is equivalent to calling its quote_name_unless_alias method. """ warnings.warn( "Calling a SQLCompiler directly is deprecated. " "Call compiler.quote_name_unless_alias instead.", RemovedInDjango20Warning, stacklevel=2) return self.quote_name_unless_alias(name) def quote_name_unless_alias(self, name): """ A wrapper around connection.ops.quote_name that doesn't quote aliases for table names. This avoids problems with some SQL dialects that treat Loading @@ -61,14 +74,6 @@ class SQLCompiler(object): self.quote_cache[name] = r return r def quote_name_unless_alias(self, name): """ A wrapper around connection.ops.quote_name that doesn't quote aliases for table names. This avoids problems with some SQL dialects that treat quoted strings specially (e.g. PostgreSQL). """ return self(name) def compile(self, node): vendor_impl = getattr( node, 'as_' + self.connection.vendor, None) Loading Loading @@ -198,7 +203,7 @@ class SQLCompiler(object): (without the table names) are given unique aliases. This is needed in some cases to avoid ambiguity with nested queries. """ qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name result = ['(%s) AS %s' % (col[0], qn2(alias)) for alias, col in six.iteritems(self.query.extra_select)] params = [] Loading Loading @@ -285,7 +290,7 @@ class SQLCompiler(object): result = [] if opts is None: opts = self.query.get_meta() qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name aliases = set() only_load = self.deferred_to_columns() Loading Loading @@ -337,7 +342,7 @@ class SQLCompiler(object): Note that this method can alter the tables in the query, and thus it must be called before get_from_clause(). """ qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name result = [] opts = self.query.get_meta() Loading Loading @@ -370,7 +375,7 @@ class SQLCompiler(object): ordering = (self.query.order_by or self.query.get_meta().ordering or []) qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name distinct = self.query.distinct select_aliases = self._select_aliases Loading Loading @@ -509,7 +514,7 @@ class SQLCompiler(object): ordering and distinct must be done first. """ result = [] qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name first = True from_params = [] Loading Loading @@ -559,7 +564,7 @@ class SQLCompiler(object): """ Returns a tuple representing the SQL elements in the "group by" clause. """ qn = self qn = self.quote_name_unless_alias result, params = [], [] if self.query.group_by is not None: select_cols = self.query.select + self.query.related_select_cols Loading Loading @@ -853,8 +858,9 @@ class SQLCompiler(object): cursor.close() return result def as_subquery_condition(self, alias, columns, qn): inner_qn = self def as_subquery_condition(self, alias, columns, compiler): qn = compiler.quote_name_unless_alias inner_qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name if len(columns) == 1: sql, params = self.as_sql() Loading Loading @@ -967,7 +973,7 @@ class SQLDeleteCompiler(SQLCompiler): """ assert len(self.query.tables) == 1, \ "Can only delete from one table at a time." qn = self qn = self.quote_name_unless_alias result = ['DELETE FROM %s' % qn(self.query.tables[0])] where, params = self.compile(self.query.where) if where: Loading @@ -985,7 +991,7 @@ class SQLUpdateCompiler(SQLCompiler): if not self.query.values: return '', () table = self.query.tables[0] qn = self qn = self.quote_name_unless_alias result = ['UPDATE %s' % qn(table)] result.append('SET') values, update_params = [], [] Loading docs/internals/deprecation.txt +3 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ about each item can often be found in the release notes of two versions prior. See the :ref:`Django 1.8 release notes<deprecated-features-1.8>` for more details on these changes. * Support for calling a ``SQLCompiler`` directly as an alias for calling its ``quote_name_unless_alias`` method will be removed. * ``cycle`` and ``firstof`` template tags will be removed from the ``future`` template tag library (used during the 1.6/1.7 deprecation period). Loading docs/releases/1.8.txt +14 −0 Original line number Diff line number Diff line Loading @@ -1049,6 +1049,20 @@ loader that inherits ``BaseLoader``, you must inherit ``Loader`` instead. Private API ``django.test.utils.TestTemplateLoader`` is deprecated in favor of ``django.template.loaders.locmem.Loader``. ``qn`` replaced by ``compiler`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In previous Django versions, various internal ORM methods (mostly ``as_sql`` methods) accepted a ``qn`` (for "quote name") argument, which was a reference to a function that quoted identifiers for sending to the database. In Django 1.8, that argument has been renamed to ``compiler`` and is now a full ``SQLCompiler`` instance. For backwards-compatibility, calling a ``SQLCompiler`` instance performs the same name-quoting that the ``qn`` function used to. However, this backwards-compatibility shim is immediately deprecated: you should rename your ``qn`` arguments to ``compiler``, and call ``compiler.quote_name_unless_alias(...)`` where you previously called ``qn(...)``. .. removed-features-1.8: Features removed in 1.8 Loading Loading
django/db/models/sql/compiler.py +25 −19 Original line number Diff line number Diff line import datetime import warnings from django.conf import settings from django.core.exceptions import FieldError Loading @@ -12,8 +13,9 @@ from django.db.models.sql.query import get_order_dir, Query from django.db.transaction import TransactionManagementError from django.db.utils import DatabaseError from django.utils import six from django.utils.six.moves import zip from django.utils import timezone from django.utils.deprecation import RemovedInDjango20Warning from django.utils.six.moves import zip class SQLCompiler(object): Loading Loading @@ -46,6 +48,17 @@ class SQLCompiler(object): self.fill_related_selections() def __call__(self, name): """ Backwards-compatibility shim so that calling a SQLCompiler is equivalent to calling its quote_name_unless_alias method. """ warnings.warn( "Calling a SQLCompiler directly is deprecated. " "Call compiler.quote_name_unless_alias instead.", RemovedInDjango20Warning, stacklevel=2) return self.quote_name_unless_alias(name) def quote_name_unless_alias(self, name): """ A wrapper around connection.ops.quote_name that doesn't quote aliases for table names. This avoids problems with some SQL dialects that treat Loading @@ -61,14 +74,6 @@ class SQLCompiler(object): self.quote_cache[name] = r return r def quote_name_unless_alias(self, name): """ A wrapper around connection.ops.quote_name that doesn't quote aliases for table names. This avoids problems with some SQL dialects that treat quoted strings specially (e.g. PostgreSQL). """ return self(name) def compile(self, node): vendor_impl = getattr( node, 'as_' + self.connection.vendor, None) Loading Loading @@ -198,7 +203,7 @@ class SQLCompiler(object): (without the table names) are given unique aliases. This is needed in some cases to avoid ambiguity with nested queries. """ qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name result = ['(%s) AS %s' % (col[0], qn2(alias)) for alias, col in six.iteritems(self.query.extra_select)] params = [] Loading Loading @@ -285,7 +290,7 @@ class SQLCompiler(object): result = [] if opts is None: opts = self.query.get_meta() qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name aliases = set() only_load = self.deferred_to_columns() Loading Loading @@ -337,7 +342,7 @@ class SQLCompiler(object): Note that this method can alter the tables in the query, and thus it must be called before get_from_clause(). """ qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name result = [] opts = self.query.get_meta() Loading Loading @@ -370,7 +375,7 @@ class SQLCompiler(object): ordering = (self.query.order_by or self.query.get_meta().ordering or []) qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name distinct = self.query.distinct select_aliases = self._select_aliases Loading Loading @@ -509,7 +514,7 @@ class SQLCompiler(object): ordering and distinct must be done first. """ result = [] qn = self qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name first = True from_params = [] Loading Loading @@ -559,7 +564,7 @@ class SQLCompiler(object): """ Returns a tuple representing the SQL elements in the "group by" clause. """ qn = self qn = self.quote_name_unless_alias result, params = [], [] if self.query.group_by is not None: select_cols = self.query.select + self.query.related_select_cols Loading Loading @@ -853,8 +858,9 @@ class SQLCompiler(object): cursor.close() return result def as_subquery_condition(self, alias, columns, qn): inner_qn = self def as_subquery_condition(self, alias, columns, compiler): qn = compiler.quote_name_unless_alias inner_qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name if len(columns) == 1: sql, params = self.as_sql() Loading Loading @@ -967,7 +973,7 @@ class SQLDeleteCompiler(SQLCompiler): """ assert len(self.query.tables) == 1, \ "Can only delete from one table at a time." qn = self qn = self.quote_name_unless_alias result = ['DELETE FROM %s' % qn(self.query.tables[0])] where, params = self.compile(self.query.where) if where: Loading @@ -985,7 +991,7 @@ class SQLUpdateCompiler(SQLCompiler): if not self.query.values: return '', () table = self.query.tables[0] qn = self qn = self.quote_name_unless_alias result = ['UPDATE %s' % qn(table)] result.append('SET') values, update_params = [], [] Loading
docs/internals/deprecation.txt +3 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ about each item can often be found in the release notes of two versions prior. See the :ref:`Django 1.8 release notes<deprecated-features-1.8>` for more details on these changes. * Support for calling a ``SQLCompiler`` directly as an alias for calling its ``quote_name_unless_alias`` method will be removed. * ``cycle`` and ``firstof`` template tags will be removed from the ``future`` template tag library (used during the 1.6/1.7 deprecation period). Loading
docs/releases/1.8.txt +14 −0 Original line number Diff line number Diff line Loading @@ -1049,6 +1049,20 @@ loader that inherits ``BaseLoader``, you must inherit ``Loader`` instead. Private API ``django.test.utils.TestTemplateLoader`` is deprecated in favor of ``django.template.loaders.locmem.Loader``. ``qn`` replaced by ``compiler`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In previous Django versions, various internal ORM methods (mostly ``as_sql`` methods) accepted a ``qn`` (for "quote name") argument, which was a reference to a function that quoted identifiers for sending to the database. In Django 1.8, that argument has been renamed to ``compiler`` and is now a full ``SQLCompiler`` instance. For backwards-compatibility, calling a ``SQLCompiler`` instance performs the same name-quoting that the ``qn`` function used to. However, this backwards-compatibility shim is immediately deprecated: you should rename your ``qn`` arguments to ``compiler``, and call ``compiler.quote_name_unless_alias(...)`` where you previously called ``qn(...)``. .. removed-features-1.8: Features removed in 1.8 Loading