diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-06-03 06:44:05 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-06-04 12:26:25 +0200 |
| commit | f83b44075dafa429d59e8755aa47e15577cc49f9 (patch) | |
| tree | 71191d9568e2360527292b8f0b358aa71597c7da /django | |
| parent | 8c7992f658e1125f8dc20b19206e8bbbe4187372 (diff) | |
Refs #30913 -- Added system checks for covering indexes and unique constraints support.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/base.py | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py index d082c35917..fcda6e202f 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -1614,12 +1614,10 @@ class Model(metaclass=ModelBase): if not router.allow_migrate_model(db, cls): continue connection = connections[db] - if ( + if not ( connection.features.supports_partial_indexes or 'supports_partial_indexes' in cls._meta.required_db_features - ): - continue - if any(index.condition is not None for index in cls._meta.indexes): + ) and any(index.condition is not None for index in cls._meta.indexes): errors.append( checks.Warning( '%s does not support indexes with conditions.' @@ -1632,6 +1630,22 @@ class Model(metaclass=ModelBase): id='models.W037', ) ) + if not ( + connection.features.supports_covering_indexes or + 'supports_covering_indexes' in cls._meta.required_db_features + ) and any(index.include for index in cls._meta.indexes): + errors.append( + checks.Warning( + '%s does not support indexes with non-key columns.' + % connection.display_name, + hint=( + "Non-key columns will be ignored. Silence this " + "warning if you don't care about it." + ), + obj=cls, + id='models.W040', + ) + ) fields = [field for index in cls._meta.indexes for field, _ in index.fields_orders] fields += [include for index in cls._meta.indexes for include in index.include] errors.extend(cls._check_local_fields(fields, 'indexes')) @@ -1927,6 +1941,25 @@ class Model(metaclass=ModelBase): id='models.W038', ) ) + if not ( + connection.features.supports_covering_indexes or + 'supports_covering_indexes' in cls._meta.required_db_features + ) and any( + isinstance(constraint, UniqueConstraint) and constraint.include + for constraint in cls._meta.constraints + ): + errors.append( + checks.Warning( + '%s does not support unique constraints with non-key ' + 'columns.' % connection.display_name, + hint=( + "A constraint won't be created. Silence this " + "warning if you don't care about it." + ), + obj=cls, + id='models.W039', + ) + ) fields = chain.from_iterable( (*constraint.fields, *constraint.include) for constraint in cls._meta.constraints if isinstance(constraint, UniqueConstraint) |
