diff options
author | django-bot <ops@djangoproject.com> | 2022-02-03 20:24:19 +0100 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-02-07 20:37:05 +0100 |
commit | 9c19aff7c7561e3a82978a272ecdaad40dda5c00 (patch) | |
tree | f0506b668a013d0063e5fba3dbf4863b466713ba /django/db/backends/mysql/features.py | |
parent | f68fa8b45dfac545cfc4111d4e52804c86db68d3 (diff) | |
download | django-9c19aff7c7561e3a82978a272ecdaad40dda5c00.tar.gz |
Refs #33476 -- Reformatted code with Black.
Diffstat (limited to 'django/db/backends/mysql/features.py')
-rw-r--r-- | django/db/backends/mysql/features.py | 202 |
1 files changed, 122 insertions, 80 deletions
diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py index 5d6c4afde0..d485d40d60 100644 --- a/django/db/backends/mysql/features.py +++ b/django/db/backends/mysql/features.py @@ -50,87 +50,104 @@ class DatabaseFeatures(BaseDatabaseFeatures): @cached_property def test_collations(self): - charset = 'utf8' - if self.connection.mysql_is_mariadb and self.connection.mysql_version >= (10, 6): + charset = "utf8" + if self.connection.mysql_is_mariadb and self.connection.mysql_version >= ( + 10, + 6, + ): # utf8 is an alias for utf8mb3 in MariaDB 10.6+. - charset = 'utf8mb3' + charset = "utf8mb3" return { - 'ci': f'{charset}_general_ci', - 'non_default': f'{charset}_esperanto_ci', - 'swedish_ci': f'{charset}_swedish_ci', + "ci": f"{charset}_general_ci", + "non_default": f"{charset}_esperanto_ci", + "swedish_ci": f"{charset}_swedish_ci", } - test_now_utc_template = 'UTC_TIMESTAMP' + test_now_utc_template = "UTC_TIMESTAMP" @cached_property def django_test_skips(self): skips = { "This doesn't work on MySQL.": { - 'db_functions.comparison.test_greatest.GreatestTests.test_coalesce_workaround', - 'db_functions.comparison.test_least.LeastTests.test_coalesce_workaround', + "db_functions.comparison.test_greatest.GreatestTests.test_coalesce_workaround", + "db_functions.comparison.test_least.LeastTests.test_coalesce_workaround", }, - 'Running on MySQL requires utf8mb4 encoding (#18392).': { - 'model_fields.test_textfield.TextFieldTests.test_emoji', - 'model_fields.test_charfield.TestCharField.test_emoji', + "Running on MySQL requires utf8mb4 encoding (#18392).": { + "model_fields.test_textfield.TextFieldTests.test_emoji", + "model_fields.test_charfield.TestCharField.test_emoji", }, "MySQL doesn't support functional indexes on a function that " "returns JSON": { - 'schema.tests.SchemaTests.test_func_index_json_key_transform', + "schema.tests.SchemaTests.test_func_index_json_key_transform", }, "MySQL supports multiplying and dividing DurationFields by a " "scalar value but it's not implemented (#25287).": { - 'expressions.tests.FTimeDeltaTests.test_durationfield_multiply_divide', + "expressions.tests.FTimeDeltaTests.test_durationfield_multiply_divide", }, } - if 'ONLY_FULL_GROUP_BY' in self.connection.sql_mode: - skips.update({ - 'GROUP BY optimization does not work properly when ' - 'ONLY_FULL_GROUP_BY mode is enabled on MySQL, see #31331.': { - 'aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_multivalued', - 'annotations.tests.NonAggregateAnnotationTestCase.test_annotation_aggregate_with_m2o', - }, - }) - if not self.connection.mysql_is_mariadb and self.connection.mysql_version < (8,): - skips.update({ - 'Casting to datetime/time is not supported by MySQL < 8.0. (#30224)': { - 'aggregation.tests.AggregateTestCase.test_aggregation_default_using_time_from_python', - 'aggregation.tests.AggregateTestCase.test_aggregation_default_using_datetime_from_python', - }, - 'MySQL < 8.0 returns string type instead of datetime/time. (#30224)': { - 'aggregation.tests.AggregateTestCase.test_aggregation_default_using_time_from_database', - 'aggregation.tests.AggregateTestCase.test_aggregation_default_using_datetime_from_database', - }, - }) - if ( - self.connection.mysql_is_mariadb and - (10, 4, 3) < 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 ( - self.connection.mysql_is_mariadb and - (10, 4, 12) < self.connection.mysql_version < (10, 5) + if "ONLY_FULL_GROUP_BY" in self.connection.sql_mode: + skips.update( + { + "GROUP BY optimization does not work properly when " + "ONLY_FULL_GROUP_BY mode is enabled on MySQL, see #31331.": { + "aggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_multivalued", + "annotations.tests.NonAggregateAnnotationTestCase.test_annotation_aggregate_with_m2o", + }, + } + ) + if not self.connection.mysql_is_mariadb and self.connection.mysql_version < ( + 8, ): - skips.update({ - 'https://jira.mariadb.org/browse/MDEV-22775': { - 'schema.tests.SchemaTests.test_alter_pk_with_self_referential_field', - }, - }) + skips.update( + { + "Casting to datetime/time is not supported by MySQL < 8.0. (#30224)": { + "aggregation.tests.AggregateTestCase.test_aggregation_default_using_time_from_python", + "aggregation.tests.AggregateTestCase.test_aggregation_default_using_datetime_from_python", + }, + "MySQL < 8.0 returns string type instead of datetime/time. (#30224)": { + "aggregation.tests.AggregateTestCase.test_aggregation_default_using_time_from_database", + "aggregation.tests.AggregateTestCase.test_aggregation_default_using_datetime_from_database", + }, + } + ) + if self.connection.mysql_is_mariadb and ( + 10, + 4, + 3, + ) < 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 self.connection.mysql_is_mariadb and ( + 10, + 4, + 12, + ) < self.connection.mysql_version < (10, 5): + skips.update( + { + "https://jira.mariadb.org/browse/MDEV-22775": { + "schema.tests.SchemaTests.test_alter_pk_with_self_referential_field", + }, + } + ) if not self.supports_explain_analyze: - skips.update({ - 'MariaDB and MySQL >= 8.0.18 specific.': { - 'queries.test_explain.ExplainTests.test_mysql_analyze', - }, - }) + skips.update( + { + "MariaDB and MySQL >= 8.0.18 specific.": { + "queries.test_explain.ExplainTests.test_mysql_analyze", + }, + } + ) return skips @cached_property def _mysql_storage_engine(self): "Internal method used in Django tests. Don't rely on this from your code" - return self.connection.mysql_server_data['default_storage_engine'] + return self.connection.mysql_server_data["default_storage_engine"] @cached_property def allows_auto_pk_0(self): @@ -138,40 +155,50 @@ class DatabaseFeatures(BaseDatabaseFeatures): Autoincrement primary key can be set to 0 if it doesn't generate new autoincrement values. """ - return 'NO_AUTO_VALUE_ON_ZERO' in self.connection.sql_mode + return "NO_AUTO_VALUE_ON_ZERO" in self.connection.sql_mode @cached_property def update_can_self_select(self): - return self.connection.mysql_is_mariadb and self.connection.mysql_version >= (10, 3, 2) + return self.connection.mysql_is_mariadb and self.connection.mysql_version >= ( + 10, + 3, + 2, + ) @cached_property def can_introspect_foreign_keys(self): "Confirm support for introspected foreign keys" - return self._mysql_storage_engine != 'MyISAM' + return self._mysql_storage_engine != "MyISAM" @cached_property def introspected_field_types(self): return { **super().introspected_field_types, - 'BinaryField': 'TextField', - 'BooleanField': 'IntegerField', - 'DurationField': 'BigIntegerField', - 'GenericIPAddressField': 'CharField', + "BinaryField": "TextField", + "BooleanField": "IntegerField", + "DurationField": "BigIntegerField", + "GenericIPAddressField": "CharField", } @cached_property def can_return_columns_from_insert(self): - return self.connection.mysql_is_mariadb and self.connection.mysql_version >= (10, 5, 0) + return self.connection.mysql_is_mariadb and self.connection.mysql_version >= ( + 10, + 5, + 0, + ) - can_return_rows_from_bulk_insert = property(operator.attrgetter('can_return_columns_from_insert')) + can_return_rows_from_bulk_insert = property( + operator.attrgetter("can_return_columns_from_insert") + ) @cached_property def has_zoneinfo_database(self): - return self.connection.mysql_server_data['has_zoneinfo_database'] + return self.connection.mysql_server_data["has_zoneinfo_database"] @cached_property def is_sql_auto_is_null_enabled(self): - return self.connection.mysql_server_data['sql_auto_is_null'] + return self.connection.mysql_server_data["sql_auto_is_null"] @cached_property def supports_over_clause(self): @@ -179,7 +206,9 @@ class DatabaseFeatures(BaseDatabaseFeatures): return True return self.connection.mysql_version >= (8, 0, 2) - supports_frame_range_fixed_distance = property(operator.attrgetter('supports_over_clause')) + supports_frame_range_fixed_distance = property( + operator.attrgetter("supports_over_clause") + ) @cached_property def supports_column_check_constraints(self): @@ -187,7 +216,9 @@ class DatabaseFeatures(BaseDatabaseFeatures): return True return self.connection.mysql_version >= (8, 0, 16) - supports_table_check_constraints = property(operator.attrgetter('supports_column_check_constraints')) + supports_table_check_constraints = property( + operator.attrgetter("supports_column_check_constraints") + ) @cached_property def can_introspect_check_constraints(self): @@ -210,19 +241,30 @@ class DatabaseFeatures(BaseDatabaseFeatures): @cached_property def has_select_for_update_of(self): - return not self.connection.mysql_is_mariadb and self.connection.mysql_version >= (8, 0, 1) + return ( + not self.connection.mysql_is_mariadb + and self.connection.mysql_version >= (8, 0, 1) + ) @cached_property def supports_explain_analyze(self): - return self.connection.mysql_is_mariadb or self.connection.mysql_version >= (8, 0, 18) + return self.connection.mysql_is_mariadb or self.connection.mysql_version >= ( + 8, + 0, + 18, + ) @cached_property def supported_explain_formats(self): # Alias MySQL's TRADITIONAL to TEXT for consistency with other # backends. - formats = {'JSON', 'TEXT', 'TRADITIONAL'} - if not self.connection.mysql_is_mariadb and self.connection.mysql_version >= (8, 0, 16): - formats.add('TREE') + formats = {"JSON", "TEXT", "TRADITIONAL"} + if not self.connection.mysql_is_mariadb and self.connection.mysql_version >= ( + 8, + 0, + 16, + ): + formats.add("TREE") return formats @cached_property @@ -230,11 +272,11 @@ class DatabaseFeatures(BaseDatabaseFeatures): """ All storage engines except MyISAM support transactions. """ - return self._mysql_storage_engine != 'MyISAM' + return self._mysql_storage_engine != "MyISAM" @cached_property def ignores_table_name_case(self): - return self.connection.mysql_server_data['lower_case_table_names'] + return self.connection.mysql_server_data["lower_case_table_names"] @cached_property def supports_default_in_lead_lag(self): @@ -256,13 +298,13 @@ class DatabaseFeatures(BaseDatabaseFeatures): @cached_property def supports_index_column_ordering(self): return ( - not self.connection.mysql_is_mariadb and - self.connection.mysql_version >= (8, 0, 1) + not self.connection.mysql_is_mariadb + and self.connection.mysql_version >= (8, 0, 1) ) @cached_property def supports_expression_indexes(self): return ( - not self.connection.mysql_is_mariadb and - self.connection.mysql_version >= (8, 0, 13) + not self.connection.mysql_is_mariadb + and self.connection.mysql_version >= (8, 0, 13) ) |