summaryrefslogtreecommitdiff
path: root/django/db/backends/mysql/features.py
diff options
context:
space:
mode:
authordjango-bot <ops@djangoproject.com>2022-02-03 20:24:19 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-02-07 20:37:05 +0100
commit9c19aff7c7561e3a82978a272ecdaad40dda5c00 (patch)
treef0506b668a013d0063e5fba3dbf4863b466713ba /django/db/backends/mysql/features.py
parentf68fa8b45dfac545cfc4111d4e52804c86db68d3 (diff)
downloaddjango-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.py202
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)
)