diff options
| author | Albert Defler <alnw@interia.eu> | 2022-10-19 13:20:48 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-08-02 14:11:04 +0200 |
| commit | 7cd187a5ba58d7769039f487faeb9a5a2ff05540 (patch) | |
| tree | ff502efdd96b864a1ab12ea25b9032025767e4cb /django | |
| parent | ee36c332b24247ba3790a355a13e682537258d6d (diff) | |
Fixed #33507 -- Used UUID data type on MariaDB 10.7+.
Co-Authored-By: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/backends/mysql/base.py | 10 | ||||
| -rw-r--r-- | django/db/backends/mysql/features.py | 5 | ||||
| -rw-r--r-- | django/db/backends/mysql/introspection.py | 6 | ||||
| -rw-r--r-- | django/db/models/fields/related_descriptors.py | 5 |
4 files changed, 23 insertions, 3 deletions
diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 6811b10abb..e2707a9bfd 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -103,7 +103,8 @@ class DatabaseWrapper(BaseDatabaseWrapper): # types, as strings. Column-type strings can contain format strings; they'll # be interpolated against the values of Field.__dict__ before being output. # If a column type is set to None, it won't be included in the output. - data_types = { + + _data_types = { "AutoField": "integer AUTO_INCREMENT", "BigAutoField": "bigint AUTO_INCREMENT", "BinaryField": "longblob", @@ -133,6 +134,13 @@ class DatabaseWrapper(BaseDatabaseWrapper): "UUIDField": "char(32)", } + @cached_property + def data_types(self): + _data_types = self._data_types.copy() + if self.features.has_native_uuid_field: + _data_types["UUIDField"] = "uuid" + return _data_types + # For these data types: # - MySQL < 8.0.13 doesn't accept default values and implicitly treats them # as nullable diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py index 0bb0f91f55..7f733254ee 100644 --- a/django/db/backends/mysql/features.py +++ b/django/db/backends/mysql/features.py @@ -349,3 +349,8 @@ class DatabaseFeatures(BaseDatabaseFeatures): if self.connection.mysql_is_mariadb: return True return self.connection.mysql_version >= (8, 0, 13) + + @cached_property + def has_native_uuid_field(self): + is_mariadb = self.connection.mysql_is_mariadb + return is_mariadb and self.connection.mysql_version >= (10, 7) diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py index a5ebf37112..a1ee51a692 100644 --- a/django/db/backends/mysql/introspection.py +++ b/django/db/backends/mysql/introspection.py @@ -11,7 +11,8 @@ from django.utils.datastructures import OrderedSet FieldInfo = namedtuple( "FieldInfo", - BaseFieldInfo._fields + ("extra", "is_unsigned", "has_json_constraint", "comment"), + BaseFieldInfo._fields + + ("extra", "is_unsigned", "has_json_constraint", "comment", "data_type"), ) InfoLine = namedtuple( "InfoLine", @@ -62,6 +63,8 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): return "PositiveIntegerField" elif field_type == "SmallIntegerField": return "PositiveSmallIntegerField" + if description.data_type.upper() == "UUID": + return "UUIDField" # JSON data type is an alias for LONGTEXT in MariaDB, use check # constraints clauses to introspect JSONField. if description.has_json_constraint: @@ -172,6 +175,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): info.is_unsigned, line[0] in json_constraints, info.comment, + info.data_type, ) ) return fields diff --git a/django/db/models/fields/related_descriptors.py b/django/db/models/fields/related_descriptors.py index 422b08e6ca..4d6164143b 100644 --- a/django/db/models/fields/related_descriptors.py +++ b/django/db/models/fields/related_descriptors.py @@ -1118,7 +1118,10 @@ def create_forward_many_to_many_manager(superclass, rel, reverse): return ( queryset, lambda result: tuple( - getattr(result, "_prefetch_related_val_%s" % f.attname) + f.get_db_prep_value( + getattr(result, f"_prefetch_related_val_{f.attname}"), + connection, + ) for f in fk.local_related_fields ), lambda inst: tuple( |
