From 6fe445a8399970a10b546ce9ae25675dc4ec3926 Mon Sep 17 00:00:00 2001 From: Sicong Jia Date: Thu, 15 Apr 2021 13:03:12 -0700 Subject: [PATCH] Issue #25 -- Fix Django 3.2 startup issue --- mssql/compiler.py | 8 +++++--- mssql/functions.py | 6 ++++-- mssql/schema.py | 12 ++++++++---- testapp/settings.py | 2 ++ tox.ini | 2 ++ 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/mssql/compiler.py b/mssql/compiler.py index b76b3c69..a61b5999 100644 --- a/mssql/compiler.py +++ b/mssql/compiler.py @@ -13,7 +13,8 @@ from django.db.models.sql import compiler from django.db.transaction import TransactionManagementError from django.db.utils import NotSupportedError -from django.db.models.fields.json import compile_json_path, KeyTransform as json_KeyTransform +if django.VERSION >= (3, 1): + from django.db.models.fields.json import compile_json_path, KeyTransform as json_KeyTransform def _as_sql_agv(self, compiler, connection): return self.as_sql(compiler, connection, template='%(function)s(CONVERT(float, %(field)s))') @@ -387,8 +388,6 @@ def _as_microsoft(self, node): as_microsoft = _as_sql_count elif isinstance(node, Greatest): as_microsoft = _as_sql_greatest - if isinstance(node, json_KeyTransform): - as_microsoft = _as_sql_json_keytransform elif isinstance(node, Least): as_microsoft = _as_sql_least elif isinstance(node, Length): @@ -409,6 +408,9 @@ def _as_microsoft(self, node): as_microsoft = _as_sql_trim elif isinstance(node, Variance): as_microsoft = _as_sql_variance + if django.VERSION >= (3, 1): + if isinstance(node, json_KeyTransform): + as_microsoft = _as_sql_json_keytransform if as_microsoft: node = node.copy() node.as_microsoft = types.MethodType(as_microsoft, node) diff --git a/mssql/functions.py b/mssql/functions.py index 1f50c6cf..43b11243 100644 --- a/mssql/functions.py +++ b/mssql/functions.py @@ -7,7 +7,8 @@ from django.db.models.functions.math import ATan2, Log, Ln, Mod, Round from django.db.models.expressions import Case, Exists, OrderBy, When from django.db.models.lookups import Lookup, In, Exact -from django.db.models.fields.json import KeyTransform, KeyTransformExact +if VERSION >= (3, 1): + from django.db.models.fields.json import KeyTransform, KeyTransformExact DJANGO3 = VERSION[0] >= 3 @@ -120,7 +121,8 @@ def KeyTransformExact_process_rhs(self, compiler, connection): ATan2.as_microsoft = sqlserver_atan2 In.split_parameter_list_as_sql = split_parameter_list_as_sql -KeyTransformExact.process_rhs = KeyTransformExact_process_rhs +if VERSION >= (3, 1): + KeyTransformExact.process_rhs = KeyTransformExact_process_rhs Ln.as_microsoft = sqlserver_ln Log.as_microsoft = sqlserver_log Mod.as_microsoft = sqlserver_mod diff --git a/mssql/schema.py b/mssql/schema.py index b7b27c4b..6d151c15 100644 --- a/mssql/schema.py +++ b/mssql/schema.py @@ -235,6 +235,7 @@ def _db_table_delete_constraint_sql(self, template, db_table, name): template, table=Table(db_table, self.quote_name), name=self.quote_name(name), + include='' ) def alter_db_table(self, model, old_db_table, new_db_table): @@ -689,7 +690,7 @@ def add_field(self, model, field): if self.connection.features.connection_persists_old_columns: self.connection.close() - def _create_unique_sql(self, model, columns, name=None, condition=None, deferrable=None): + def _create_unique_sql(self, model, columns, name=None, condition=None, deferrable=None, include=None, opclasses=None): if (deferrable and not getattr(self.connection.features, 'supports_deferrable_unique_constraints', False)): return None @@ -713,7 +714,8 @@ def create_unique_name(*args, **kwargs): name=name, columns=columns, condition=' WHERE ' + condition, - **statement_args + **statement_args, + include='', ) if self.connection.features.supports_partial_indexes else None else: return Statement( @@ -721,12 +723,13 @@ def create_unique_name(*args, **kwargs): table=table, name=name, columns=columns, - **statement_args + **statement_args, + include='', ) def _create_index_sql(self, model, fields, *, name=None, suffix='', using='', db_tablespace=None, col_suffixes=(), sql=None, opclasses=(), - condition=None): + condition=None, include=None, expressions=None): """ Return the SQL statement to create the index for one or several fields. `sql` can be specified if the syntax differs from the standard (GIS @@ -751,6 +754,7 @@ def create_index_name(*args, **kwargs): columns=self._index_columns(table, columns, col_suffixes, opclasses), extra=tablespace_sql, condition=(' WHERE ' + condition) if condition else '', + include='' ) def create_model(self, model): diff --git a/testapp/settings.py b/testapp/settings.py index 15694aba..53901cd4 100644 --- a/testapp/settings.py +++ b/testapp/settings.py @@ -36,6 +36,8 @@ 'django.contrib.auth.hashers.PBKDF2PasswordHasher', ] +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' + ENABLE_REGEX_TESTS = False TEST_RUNNER = "testapp.runners.ExcludedTestSuiteRunner" diff --git a/tox.ini b/tox.ini index 19e2d25e..cef93c0f 100644 --- a/tox.ini +++ b/tox.ini @@ -3,6 +3,7 @@ envlist = {py36,py37}-django22, {py36,py37,py38}-django30, {py36,py37,py38}-django31, + {py36,py37,py38,py39}-django32 [testenv] allowlist_externals = @@ -17,3 +18,4 @@ deps = django22: django==2.2.* django30: django>=3.0,<3.1 django31: django>=3.1,<3.2 + django32: django==3.2.*