Fixed #31144 -- Relaxed system check for max_length of CharFields on MySQL/MariaDB by turning into a warning.
This commit is contained in:
parent
c1c361677d
commit
2695ac8e04
|
@ -41,11 +41,15 @@ class DatabaseValidation(BaseDatabaseValidation):
|
||||||
if (field_type.startswith('varchar') and field.unique and
|
if (field_type.startswith('varchar') and field.unique and
|
||||||
(field.max_length is None or int(field.max_length) > 255)):
|
(field.max_length is None or int(field.max_length) > 255)):
|
||||||
errors.append(
|
errors.append(
|
||||||
checks.Error(
|
checks.Warning(
|
||||||
'%s does not allow unique CharFields to have a max_length '
|
'%s may not allow unique CharFields to have a max_length '
|
||||||
'> 255.' % self.connection.display_name,
|
'> 255.' % self.connection.display_name,
|
||||||
obj=field,
|
obj=field,
|
||||||
id='mysql.E001',
|
hint=(
|
||||||
|
'See: https://docs.djangoproject.com/en/%s/ref/'
|
||||||
|
'databases/#mysql-character-fields' % get_docs_version()
|
||||||
|
),
|
||||||
|
id='mysql.W003',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -127,9 +127,12 @@ MySQL and MariaDB
|
||||||
If you're using MySQL or MariaDB, the following checks will be performed:
|
If you're using MySQL or MariaDB, the following checks will be performed:
|
||||||
|
|
||||||
* **mysql.E001**: MySQL/MariaDB does not allow unique ``CharField``\s to have a
|
* **mysql.E001**: MySQL/MariaDB does not allow unique ``CharField``\s to have a
|
||||||
``max_length`` > 255.
|
``max_length`` > 255. *This check was changed to* ``mysql.W003`` *in Django
|
||||||
|
3.1 as the real maximum size depends on many factors.*
|
||||||
* **mysql.W002**: MySQL/MariaDB Strict Mode is not set for database connection
|
* **mysql.W002**: MySQL/MariaDB Strict Mode is not set for database connection
|
||||||
'<alias>'. See also :ref:`mysql-sql-mode`.
|
'<alias>'. See also :ref:`mysql-sql-mode`.
|
||||||
|
* **mysql.W003**: MySQL/MariaDB may not allow unique ``CharField``\s to have a
|
||||||
|
``max_length`` > 255.
|
||||||
|
|
||||||
Model fields
|
Model fields
|
||||||
------------
|
------------
|
||||||
|
|
|
@ -581,13 +581,18 @@ these methods in no-op's based in the results of such detection.
|
||||||
Notes on specific fields
|
Notes on specific fields
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
.. _mysql-character-fields:
|
||||||
|
|
||||||
Character fields
|
Character fields
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Any fields that are stored with ``VARCHAR`` column types have their
|
Any fields that are stored with ``VARCHAR`` column types may have their
|
||||||
``max_length`` restricted to 255 characters if you are using ``unique=True``
|
``max_length`` restricted to 255 characters if you are using ``unique=True``
|
||||||
for the field. This affects :class:`~django.db.models.CharField`,
|
for the field. This affects :class:`~django.db.models.CharField`,
|
||||||
:class:`~django.db.models.SlugField`.
|
:class:`~django.db.models.SlugField`. See `the MySQL documentation`_ for more
|
||||||
|
details.
|
||||||
|
|
||||||
|
.. _the MySQL documentation: https://dev.mysql.com/doc/refman/en/create-index.html#create-index-column-prefixes
|
||||||
|
|
||||||
``TextField`` limitations
|
``TextField`` limitations
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
|
@ -8,6 +8,7 @@ from django.test.utils import isolate_apps, override_settings
|
||||||
from django.utils.functional import lazy
|
from django.utils.functional import lazy
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from django.utils.version import get_docs_version
|
||||||
|
|
||||||
|
|
||||||
@isolate_apps('invalid_models_tests')
|
@isolate_apps('invalid_models_tests')
|
||||||
|
@ -372,11 +373,15 @@ class CharFieldTests(SimpleTestCase):
|
||||||
field = Model._meta.get_field('field')
|
field = Model._meta.get_field('field')
|
||||||
validator = DatabaseValidation(connection=connection)
|
validator = DatabaseValidation(connection=connection)
|
||||||
self.assertEqual(validator.check_field(field), [
|
self.assertEqual(validator.check_field(field), [
|
||||||
Error(
|
DjangoWarning(
|
||||||
'%s does not allow unique CharFields to have a max_length > '
|
'%s may not allow unique CharFields to have a max_length > '
|
||||||
'255.' % connection.display_name,
|
'255.' % connection.display_name,
|
||||||
|
hint=(
|
||||||
|
'See: https://docs.djangoproject.com/en/%s/ref/databases/'
|
||||||
|
'#mysql-character-fields' % get_docs_version()
|
||||||
|
),
|
||||||
obj=field,
|
obj=field,
|
||||||
id='mysql.E001',
|
id='mysql.W003',
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue