mirror of
https://github.com/django/django.git
synced 2025-06-04 02:59:13 +00:00
Fixed #36105 -- Dropped support for MariaDB 10.5.
This commit is contained in:
parent
0bac41fc7e
commit
17160819f3
@ -11,6 +11,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||||||
allow_sliced_subqueries_with_in = False
|
allow_sliced_subqueries_with_in = False
|
||||||
has_select_for_update = True
|
has_select_for_update = True
|
||||||
has_select_for_update_nowait = True
|
has_select_for_update_nowait = True
|
||||||
|
has_select_for_update_skip_locked = True
|
||||||
supports_forward_references = False
|
supports_forward_references = False
|
||||||
supports_regex_backreferencing = False
|
supports_regex_backreferencing = False
|
||||||
supports_date_lookup_using_string = False
|
supports_date_lookup_using_string = False
|
||||||
@ -26,6 +27,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||||||
supports_over_clause = True
|
supports_over_clause = True
|
||||||
supports_frame_range_fixed_distance = True
|
supports_frame_range_fixed_distance = True
|
||||||
supports_update_conflicts = True
|
supports_update_conflicts = True
|
||||||
|
can_rename_index = True
|
||||||
delete_can_self_reference_subquery = False
|
delete_can_self_reference_subquery = False
|
||||||
create_test_procedure_without_params_sql = """
|
create_test_procedure_without_params_sql = """
|
||||||
CREATE PROCEDURE test_procedure ()
|
CREATE PROCEDURE test_procedure ()
|
||||||
@ -65,7 +67,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||||||
@cached_property
|
@cached_property
|
||||||
def minimum_database_version(self):
|
def minimum_database_version(self):
|
||||||
if self.connection.mysql_is_mariadb:
|
if self.connection.mysql_is_mariadb:
|
||||||
return (10, 5)
|
return (10, 6)
|
||||||
else:
|
else:
|
||||||
return (8, 0, 11)
|
return (8, 0, 11)
|
||||||
|
|
||||||
@ -105,17 +107,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||||||
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation_desc",
|
"update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation_desc",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if self.connection.mysql_is_mariadb and (
|
|
||||||
self.connection.mysql_version < (10, 5, 2)
|
|
||||||
):
|
|
||||||
skips.update(
|
|
||||||
{
|
|
||||||
"https://jira.mariadb.org/browse/MDEV-19598": {
|
|
||||||
"schema.tests.SchemaTests."
|
|
||||||
"test_alter_not_unique_field_to_primary_key",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if not self.supports_explain_analyze:
|
if not self.supports_explain_analyze:
|
||||||
skips.update(
|
skips.update(
|
||||||
{
|
{
|
||||||
@ -222,12 +213,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||||||
return True
|
return True
|
||||||
return self.connection.mysql_version >= (8, 0, 16)
|
return self.connection.mysql_version >= (8, 0, 16)
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def has_select_for_update_skip_locked(self):
|
|
||||||
if self.connection.mysql_is_mariadb:
|
|
||||||
return self.connection.mysql_version >= (10, 6)
|
|
||||||
return True
|
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def has_select_for_update_of(self):
|
def has_select_for_update_of(self):
|
||||||
return not self.connection.mysql_is_mariadb
|
return not self.connection.mysql_is_mariadb
|
||||||
@ -300,12 +285,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||||||
operator.attrgetter("supports_select_intersection")
|
operator.attrgetter("supports_select_intersection")
|
||||||
)
|
)
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def can_rename_index(self):
|
|
||||||
if self.connection.mysql_is_mariadb:
|
|
||||||
return self.connection.mysql_version >= (10, 5, 2)
|
|
||||||
return True
|
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def supports_expression_defaults(self):
|
def supports_expression_defaults(self):
|
||||||
if self.connection.mysql_is_mariadb:
|
if self.connection.mysql_is_mariadb:
|
||||||
|
@ -43,15 +43,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
|||||||
return "ALTER TABLE %(table)s DROP CONSTRAINT IF EXISTS %(name)s"
|
return "ALTER TABLE %(table)s DROP CONSTRAINT IF EXISTS %(name)s"
|
||||||
return "ALTER TABLE %(table)s DROP CHECK %(name)s"
|
return "ALTER TABLE %(table)s DROP CHECK %(name)s"
|
||||||
|
|
||||||
@property
|
|
||||||
def sql_rename_column(self):
|
|
||||||
is_mariadb = self.connection.mysql_is_mariadb
|
|
||||||
if is_mariadb and self.connection.mysql_version < (10, 5, 2):
|
|
||||||
# MariaDB < 10.5.2 doesn't support an
|
|
||||||
# "ALTER TABLE ... RENAME COLUMN" statement.
|
|
||||||
return "ALTER TABLE %(table)s CHANGE %(old_column)s %(new_column)s %(type)s"
|
|
||||||
return super().sql_rename_column
|
|
||||||
|
|
||||||
def quote_value(self, value):
|
def quote_value(self, value):
|
||||||
self.connection.ensure_connection()
|
self.connection.ensure_connection()
|
||||||
# MySQLdb escapes to string, PyMySQL to bytes.
|
# MySQLdb escapes to string, PyMySQL to bytes.
|
||||||
@ -241,16 +232,10 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _field_db_check(self, field, field_db_params):
|
def _field_db_check(self, field, field_db_params):
|
||||||
if self.connection.mysql_is_mariadb and self.connection.mysql_version >= (
|
if self.connection.mysql_is_mariadb:
|
||||||
10,
|
|
||||||
5,
|
|
||||||
2,
|
|
||||||
):
|
|
||||||
return super()._field_db_check(field, field_db_params)
|
return super()._field_db_check(field, field_db_params)
|
||||||
# On MySQL and MariaDB < 10.5.2 (no support for
|
# On MySQL, check constraints with the column name as it requires
|
||||||
# "ALTER TABLE ... RENAME COLUMN" statements), check constraints with
|
# explicit recreation when the column is renamed.
|
||||||
# the column name as it requires explicit recreation when the column is
|
|
||||||
# renamed.
|
|
||||||
return field_db_params["check"]
|
return field_db_params["check"]
|
||||||
|
|
||||||
def _rename_field_sql(self, table, old_field, new_field, new_type):
|
def _rename_field_sql(self, table, old_field, new_field, new_type):
|
||||||
|
@ -417,7 +417,7 @@ non-durable <https://www.postgresql.org/docs/current/non-durability.html>`_.
|
|||||||
MariaDB notes
|
MariaDB notes
|
||||||
=============
|
=============
|
||||||
|
|
||||||
Django supports MariaDB 10.5 and higher.
|
Django supports MariaDB 10.6 and higher.
|
||||||
|
|
||||||
To use MariaDB, use the MySQL backend, which is shared between the two. See the
|
To use MariaDB, use the MySQL backend, which is shared between the two. See the
|
||||||
:ref:`MySQL notes <mysql-notes>` for more details.
|
:ref:`MySQL notes <mysql-notes>` for more details.
|
||||||
@ -774,7 +774,7 @@ a :exc:`~django.db.NotSupportedError` is raised.
|
|||||||
=============== ========= =====
|
=============== ========= =====
|
||||||
Option MariaDB MySQL
|
Option MariaDB MySQL
|
||||||
=============== ========= =====
|
=============== ========= =====
|
||||||
``SKIP LOCKED`` X (≥10.6) X
|
``SKIP LOCKED`` X X
|
||||||
``NOWAIT`` X X
|
``NOWAIT`` X X
|
||||||
``OF`` X
|
``OF`` X
|
||||||
``NO KEY``
|
``NO KEY``
|
||||||
|
@ -259,9 +259,8 @@ Exactly one of ``old_name`` and ``old_fields`` can be provided. ``old_fields``
|
|||||||
is an iterable of the strings, often corresponding to fields of
|
is an iterable of the strings, often corresponding to fields of
|
||||||
``index_together`` (pre-Django 5.1 option).
|
``index_together`` (pre-Django 5.1 option).
|
||||||
|
|
||||||
On databases that don't support an index renaming statement (SQLite and MariaDB
|
On databases that don't support an index renaming statement (SQLite), the
|
||||||
< 10.5.2), the operation will drop and recreate the index, which can be
|
operation will drop and recreate the index, which can be expensive.
|
||||||
expensive.
|
|
||||||
|
|
||||||
``AddConstraint``
|
``AddConstraint``
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -237,6 +237,12 @@ backends.
|
|||||||
|
|
||||||
* ...
|
* ...
|
||||||
|
|
||||||
|
Dropped support for MariaDB 10.5
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
Upstream support for MariaDB 10.5 ends in June 2025. Django 6.0 supports
|
||||||
|
MariaDB 10.6 and higher.
|
||||||
|
|
||||||
Dropped support for Python < 3.12
|
Dropped support for Python < 3.12
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
|
@ -106,8 +106,8 @@ class Tests(TestCase):
|
|||||||
@mock.patch.object(connection, "get_database_version")
|
@mock.patch.object(connection, "get_database_version")
|
||||||
def test_check_database_version_supported(self, mocked_get_database_version):
|
def test_check_database_version_supported(self, mocked_get_database_version):
|
||||||
if connection.mysql_is_mariadb:
|
if connection.mysql_is_mariadb:
|
||||||
mocked_get_database_version.return_value = (10, 4)
|
mocked_get_database_version.return_value = (10, 5)
|
||||||
msg = "MariaDB 10.5 or later is required (found 10.4)."
|
msg = "MariaDB 10.6 or later is required (found 10.5)."
|
||||||
else:
|
else:
|
||||||
mocked_get_database_version.return_value = (8, 0, 4)
|
mocked_get_database_version.return_value = (8, 0, 4)
|
||||||
msg = "MySQL 8.0.11 or later is required (found 8.0.4)."
|
msg = "MySQL 8.0.11 or later is required (found 8.0.4)."
|
||||||
|
Loading…
x
Reference in New Issue
Block a user