Skip to content

Commit 7c058b8

Browse files
Update Django db backend base wrapper (#1791)
* Update `django.db.backends.base.base.BaseDatabaseWrapper` * Update `BaseDatabaseCreation` class * Add missing boolean flags to `BaseDatabaseFeatures` * Add missing boolean flags to `BaseDatabaseSchemaEditor` * Remove things related to `cached_property`
1 parent 6458248 commit 7c058b8

File tree

6 files changed

+49
-65
lines changed

6 files changed

+49
-65
lines changed

django-stubs/db/backends/base/base.pyi

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections.abc import Callable, Generator, Iterator, MutableMapping
22
from contextlib import contextmanager
33
from datetime import tzinfo
4+
from logging import Logger
45
from typing import Any
56

67
from django.db.backends.base.client import BaseDatabaseClient
@@ -16,10 +17,14 @@ from typing_extensions import Self, TypeAlias
1617
NO_DB_ALIAS: str
1718
RAN_DB_VERSION_CHECK: set[str]
1819

20+
logger: Logger
21+
1922
_ExecuteWrapper: TypeAlias = Callable[
2023
[Callable[[str, Any, bool, dict[str, Any]], Any], str, Any, bool, dict[str, Any]], Any
2124
]
2225

26+
def timezone_constructor(tzname: str) -> tzinfo: ...
27+
2328
class BaseDatabaseWrapper:
2429
data_types: dict[str, str]
2530
data_types_suffix: dict[str, str]
@@ -97,6 +102,7 @@ class BaseDatabaseWrapper:
97102
def enable_constraint_checking(self) -> None: ...
98103
def check_constraints(self, table_names: Any | None = ...) -> None: ...
99104
def is_usable(self) -> bool: ...
105+
def close_if_health_check_failed(self) -> None: ...
100106
def close_if_unusable_or_obsolete(self) -> None: ...
101107
@property
102108
def allow_thread_sharing(self) -> bool: ...

django-stubs/db/backends/base/creation.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ TEST_DATABASE_PREFIX: str
77
class BaseDatabaseCreation:
88
connection: BaseDatabaseWrapper
99
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
10+
def log(self, msg: str) -> None: ...
1011
def create_test_db(
1112
self, verbosity: int = ..., autoclobber: bool = ..., serialize: bool = ..., keepdb: bool = ...
1213
) -> str: ...
@@ -22,5 +23,7 @@ class BaseDatabaseCreation:
2223
keepdb: bool = ...,
2324
suffix: str | None = ...,
2425
) -> None: ...
26+
def mark_expected_failures_and_skips(self) -> None: ...
2527
def sql_table_creation_suffix(self) -> str: ...
2628
def test_db_signature(self) -> tuple[str, str, str, str]: ...
29+
def setup_worker_connection(self, _worker_id: int) -> None: ...

django-stubs/db/backends/base/features.pyi

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ from typing import Any
33

44
from django.db.backends.base.base import BaseDatabaseWrapper
55
from django.db.models.base import Model
6-
from django.db.utils import DatabaseError
6+
from django.db.utils import DatabaseError, DataError
77

88
class BaseDatabaseFeatures:
99
minimum_database_version: tuple[int, ...] | None
1010
gis_enabled: bool
1111
allows_group_by_lob: bool
1212
allows_group_by_selected_pks: bool
13+
allows_group_by_select_index: bool
1314
empty_fetchmany_value: Sequence[Any]
1415
update_can_self_select: bool
1516
interprets_empty_strings_as_nulls: bool
@@ -36,6 +37,7 @@ class BaseDatabaseFeatures:
3637
truncates_names: bool
3738
has_real_datatype: bool
3839
supports_subqueries_in_group_by: bool
40+
ignores_unnecessary_order_by_in_subqueries: bool
3941
has_native_uuid_field: bool
4042
has_native_duration_field: bool
4143
supports_temporal_subtraction: bool
@@ -60,6 +62,7 @@ class BaseDatabaseFeatures:
6062
can_distinct_on_fields: bool
6163
atomic_transactions: bool
6264
can_rollback_ddl: bool
65+
schema_editor_uses_clientside_param_binding: bool
6366
supports_atomic_references_rename: bool
6467
supports_combined_alters: bool
6568
supports_foreign_keys: bool
@@ -86,6 +89,7 @@ class BaseDatabaseFeatures:
8689
supports_select_difference: bool
8790
supports_slicing_ordering_in_compound: bool
8891
supports_parentheses_in_compound: bool
92+
requires_compound_order_by_subquery: bool
8993
supports_aggregate_filter_clause: bool
9094
supports_index_on_text_field: bool
9195
supports_over_clause: bool
@@ -95,6 +99,7 @@ class BaseDatabaseFeatures:
9599
time_cast_precision: int
96100
create_test_procedure_without_params_sql: str | None
97101
create_test_procedure_with_int_param_sql: str | None
102+
create_test_table_with_composite_primary_key: str | None
98103
supports_callproc_kwargs: bool
99104
supported_explain_formats: set[str]
100105
supports_default_in_lead_lag: bool
@@ -109,6 +114,7 @@ class BaseDatabaseFeatures:
109114
collate_as_index_expression: bool
110115
allows_multiple_constraints_on_same_fields: bool
111116
supports_boolean_expr_in_select_clause: bool
117+
supports_comparing_boolean_expr: bool
112118
supports_json_field: bool
113119
can_introspect_json_field: bool
114120
supports_primitives_in_json_field: bool
@@ -120,6 +126,11 @@ class BaseDatabaseFeatures:
120126
supports_collation_on_charfield: bool
121127
supports_collation_on_textfield: bool
122128
supports_non_deterministic_collations: bool
129+
supports_comments: bool
130+
supports_comments_inline: bool
131+
supports_logical_xor: bool
132+
prohibits_null_characters_in_text_exception: tuple[ValueError | DataError] | None
133+
supports_unlimited_charfield: bool
123134
test_collations: dict[str, str | None]
124135
test_now_utc_template: str | None
125136
django_test_expected_failures: set[str]

django-stubs/db/backends/base/schema.pyi

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ from typing import Any
77
from django.db.backends.base.base import BaseDatabaseWrapper
88
from django.db.backends.ddl_references import Statement
99
from django.db.models.base import Model
10+
from django.db.models.constraints import BaseConstraint
1011
from django.db.models.fields import Field
1112
from django.db.models.indexes import Index
1213
from typing_extensions import Self
@@ -25,9 +26,14 @@ class BaseDatabaseSchemaEditor(AbstractContextManager[Any]):
2526
sql_alter_column_not_null: str
2627
sql_alter_column_default: str
2728
sql_alter_column_no_default: str
29+
sql_alter_column_no_default_null: str
2830
sql_delete_column: str
2931
sql_rename_column: str
3032
sql_update_with_default: str
33+
sql_unique_constraint: str
34+
sql_check_constraint: str
35+
sql_delete_constraint: str
36+
sql_constraint: str
3137
sql_create_check: str
3238
sql_delete_check: str
3339
sql_create_unique: str
@@ -39,10 +45,14 @@ class BaseDatabaseSchemaEditor(AbstractContextManager[Any]):
3945
sql_delete_fk: str
4046

4147
sql_create_index: str
48+
sql_create_unique_index: str
49+
sql_rename_index: str
4250
sql_delete_index: str
4351
sql_create_pk: str
4452
sql_delete_pk: str
4553
sql_delete_procedure: str
54+
sql_alter_table_comment: str
55+
sql_alter_column_comment: str
4656
connection: BaseDatabaseWrapper
4757
collect_sql: bool
4858
collected_sql: Any
@@ -64,13 +74,17 @@ class BaseDatabaseSchemaEditor(AbstractContextManager[Any]):
6474
self, model: type[Model], field: Field, include_default: bool = ...
6575
) -> tuple[None, None] | tuple[str, list[Any]]: ...
6676
def skip_default(self, field: Any) -> bool: ...
77+
def skip_default_on_alter(self, field: Any) -> bool: ...
6778
def prepare_default(self, value: Any) -> Any: ...
6879
def effective_default(self, field: Field) -> int | str: ...
6980
def quote_value(self, value: Any) -> str: ...
7081
def create_model(self, model: type[Model]) -> None: ...
7182
def delete_model(self, model: type[Model]) -> None: ...
7283
def add_index(self, model: type[Model], index: Index) -> None: ...
7384
def remove_index(self, model: type[Model], index: Index) -> None: ...
85+
def rename_index(self, model: type[Model], old_index: Index, new_index: Index) -> None: ...
86+
def add_constraint(self, model: type[Model], constraint: BaseConstraint) -> None: ...
87+
def remove_constraint(self, model: type[Model], constraint: BaseConstraint) -> None: ...
7488
def alter_unique_together(
7589
self,
7690
model: type[Model],
@@ -84,6 +98,9 @@ class BaseDatabaseSchemaEditor(AbstractContextManager[Any]):
8498
new_index_together: Sequence[Sequence[str]],
8599
) -> None: ...
86100
def alter_db_table(self, model: type[Model], old_db_table: str, new_db_table: str) -> None: ...
101+
def alter_db_table_comment(
102+
self, model: type[Model], old_db_table_comment: str | None, new_db_table_comment: str
103+
) -> None: ...
87104
def alter_db_tablespace(self, model: Any, old_db_tablespace: Any, new_db_tablespace: Any) -> None: ...
88105
def add_field(self, model: Any, field: Any) -> None: ...
89106
def remove_field(self, model: Any, field: Any) -> None: ...

scripts/stubtest/allowlist.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,20 @@ django.utils.translation.template.block_re
9898
django.utils.version.version_component_re
9999
django.views.debug.SafeExceptionReporterFilter.hidden_settings
100100

101-
# AlterTogetherOptionsOperation.option_name is set as None,
101+
# AlterTogetherOptionOperation.option_name is set as None,
102102
# but is required in the init, so we type it as str
103103
django.db.migrations.operations.models.AlterTogetherOptionOperation.option_name
104104

105+
# These are set to None in the base class but *must* be overridden
106+
# because they are required in the init, so we type them without the None option.
107+
django.db.backends.base.base.BaseDatabaseWrapper.SchemaEditorClass
108+
django.db.backends.base.base.BaseDatabaseWrapper.client_class
109+
django.db.backends.base.base.BaseDatabaseWrapper.creation_class
110+
django.db.backends.base.base.BaseDatabaseWrapper.features_class
111+
django.db.backends.base.base.BaseDatabaseWrapper.introspection_class
112+
django.db.backends.base.base.BaseDatabaseWrapper.ops
113+
django.db.backends.base.base.BaseDatabaseWrapper.ops_class
114+
105115
# Attributes defaulting to None messing with mypy
106116
django.views.generic.detail.SingleObjectMixin.model
107117
django.views.generic.edit.BaseDeleteView.form_class

scripts/stubtest/allowlist_todo.txt

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -963,48 +963,10 @@ django.core.validators.ProhibitNullCharactersValidator.__new__
963963
django.core.validators.RegexValidator.__new__
964964
django.core.validators.StepValueValidator.__new__
965965
django.core.validators.URLValidator.__new__
966-
django.db.backends.base.base.BaseDatabaseWrapper.SchemaEditorClass
967-
django.db.backends.base.base.BaseDatabaseWrapper.client_class
968-
django.db.backends.base.base.BaseDatabaseWrapper.close_if_health_check_failed
969-
django.db.backends.base.base.BaseDatabaseWrapper.creation_class
970-
django.db.backends.base.base.BaseDatabaseWrapper.features_class
971-
django.db.backends.base.base.BaseDatabaseWrapper.introspection_class
972-
django.db.backends.base.base.BaseDatabaseWrapper.ops
973-
django.db.backends.base.base.BaseDatabaseWrapper.ops_class
974966
django.db.backends.base.base.BaseDatabaseWrapper.timezone
975967
django.db.backends.base.base.BaseDatabaseWrapper.timezone_name
976-
django.db.backends.base.base.logger
977-
django.db.backends.base.base.timezone_constructor
978-
django.db.backends.base.creation.BaseDatabaseCreation.log
979-
django.db.backends.base.creation.BaseDatabaseCreation.mark_expected_failures_and_skips
980-
django.db.backends.base.creation.BaseDatabaseCreation.setup_worker_connection
981-
django.db.backends.base.features.BaseDatabaseFeatures.allows_group_by_select_index
982-
django.db.backends.base.features.BaseDatabaseFeatures.create_test_table_with_composite_primary_key
983-
django.db.backends.base.features.BaseDatabaseFeatures.ignores_unnecessary_order_by_in_subqueries
984-
django.db.backends.base.features.BaseDatabaseFeatures.prohibits_null_characters_in_text_exception
985-
django.db.backends.base.features.BaseDatabaseFeatures.requires_compound_order_by_subquery
986-
django.db.backends.base.features.BaseDatabaseFeatures.schema_editor_uses_clientside_param_binding
987-
django.db.backends.base.features.BaseDatabaseFeatures.supports_comments
988-
django.db.backends.base.features.BaseDatabaseFeatures.supports_comments_inline
989-
django.db.backends.base.features.BaseDatabaseFeatures.supports_comparing_boolean_expr
990968
django.db.backends.base.features.BaseDatabaseFeatures.supports_explaining_query_execution
991-
django.db.backends.base.features.BaseDatabaseFeatures.supports_logical_xor
992969
django.db.backends.base.features.BaseDatabaseFeatures.supports_transactions
993-
django.db.backends.base.features.BaseDatabaseFeatures.supports_unlimited_charfield
994-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_constraint
995-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_db_table_comment
996-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_constraint
997-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.rename_index
998-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.skip_default_on_alter
999-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_alter_column_comment
1000-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_alter_column_no_default_null
1001-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_alter_table_comment
1002-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_check_constraint
1003-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_constraint
1004-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_create_unique_index
1005-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_delete_constraint
1006-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_rename_index
1007-
django.db.backends.base.schema.BaseDatabaseSchemaEditor.sql_unique_constraint
1008970
django.db.backends.ddl_references.Expressions
1009971
django.db.backends.mysql.base
1010972
django.db.backends.mysql.features.DatabaseFeatures.allows_auto_pk_0
@@ -1015,7 +977,6 @@ django.db.backends.mysql.features.DatabaseFeatures.can_release_savepoints
1015977
django.db.backends.mysql.features.DatabaseFeatures.can_rename_index
1016978
django.db.backends.mysql.features.DatabaseFeatures.can_return_columns_from_insert
1017979
django.db.backends.mysql.features.DatabaseFeatures.can_return_rows_from_bulk_insert
1018-
django.db.backends.mysql.features.DatabaseFeatures.create_test_table_with_composite_primary_key
1019980
django.db.backends.mysql.features.DatabaseFeatures.django_test_skips
1020981
django.db.backends.mysql.features.DatabaseFeatures.has_select_for_update_nowait
1021982
django.db.backends.mysql.features.DatabaseFeatures.has_select_for_update_of
@@ -1027,14 +988,11 @@ django.db.backends.mysql.features.DatabaseFeatures.is_sql_auto_is_null_enabled
1027988
django.db.backends.mysql.features.DatabaseFeatures.minimum_database_version
1028989
django.db.backends.mysql.features.DatabaseFeatures.supported_explain_formats
1029990
django.db.backends.mysql.features.DatabaseFeatures.supports_column_check_constraints
1030-
django.db.backends.mysql.features.DatabaseFeatures.supports_comments
1031-
django.db.backends.mysql.features.DatabaseFeatures.supports_comments_inline
1032991
django.db.backends.mysql.features.DatabaseFeatures.supports_default_in_lead_lag
1033992
django.db.backends.mysql.features.DatabaseFeatures.supports_explain_analyze
1034993
django.db.backends.mysql.features.DatabaseFeatures.supports_expression_indexes
1035994
django.db.backends.mysql.features.DatabaseFeatures.supports_frame_range_fixed_distance
1036995
django.db.backends.mysql.features.DatabaseFeatures.supports_index_column_ordering
1037-
django.db.backends.mysql.features.DatabaseFeatures.supports_logical_xor
1038996
django.db.backends.mysql.features.DatabaseFeatures.supports_over_clause
1039997
django.db.backends.mysql.features.DatabaseFeatures.supports_select_difference
1040998
django.db.backends.mysql.features.DatabaseFeatures.supports_select_intersection
@@ -1044,24 +1002,12 @@ django.db.backends.mysql.features.DatabaseFeatures.test_collations
10441002
django.db.backends.mysql.features.DatabaseFeatures.update_can_self_select
10451003
django.db.backends.mysql.features.DatabaseFeatures.uses_savepoints
10461004
django.db.backends.mysql.introspection
1047-
django.db.backends.mysql.schema.DatabaseSchemaEditor.remove_constraint
1048-
django.db.backends.mysql.schema.DatabaseSchemaEditor.skip_default_on_alter
10491005
django.db.backends.mysql.schema.DatabaseSchemaEditor.sql_alter_column_comment
1050-
django.db.backends.mysql.schema.DatabaseSchemaEditor.sql_alter_column_no_default_null
1051-
django.db.backends.mysql.schema.DatabaseSchemaEditor.sql_alter_table_comment
1052-
django.db.backends.mysql.schema.DatabaseSchemaEditor.sql_rename_index
10531006
django.db.backends.oracle.base
1054-
django.db.backends.oracle.features.DatabaseFeatures.allows_group_by_select_index
1055-
django.db.backends.oracle.features.DatabaseFeatures.create_test_table_with_composite_primary_key
1056-
django.db.backends.oracle.features.DatabaseFeatures.ignores_unnecessary_order_by_in_subqueries
10571007
django.db.backends.oracle.features.DatabaseFeatures.introspected_field_types
1058-
django.db.backends.oracle.features.DatabaseFeatures.requires_compound_order_by_subquery
10591008
django.db.backends.oracle.features.DatabaseFeatures.supports_collation_on_charfield
1060-
django.db.backends.oracle.features.DatabaseFeatures.supports_comments
1061-
django.db.backends.oracle.features.DatabaseFeatures.supports_comparing_boolean_expr
10621009
django.db.backends.oracle.introspection
10631010
django.db.backends.oracle.operations
1064-
django.db.backends.oracle.schema.DatabaseSchemaEditor.sql_alter_column_no_default_null
10651011
django.db.backends.oracle.utils
10661012
django.db.backends.postgresql.base.DatabaseWrapper.Database
10671013
django.db.backends.postgresql.base.DatabaseWrapper.ensure_role
@@ -1073,7 +1019,6 @@ django.db.backends.postgresql.base.INETARRAY_OID
10731019
django.db.backends.postgresql.base.PSYCOPG2_VERSION
10741020
django.db.backends.postgresql.base.psycopg2_version
10751021
django.db.backends.postgresql.base.psycopg_version
1076-
django.db.backends.postgresql.features.DatabaseFeatures.create_test_table_with_composite_primary_key
10771022
django.db.backends.postgresql.features.DatabaseFeatures.django_test_expected_failures
10781023
django.db.backends.postgresql.features.DatabaseFeatures.has_bit_xor
10791024
django.db.backends.postgresql.features.DatabaseFeatures.introspected_field_types
@@ -1083,10 +1028,7 @@ django.db.backends.postgresql.features.DatabaseFeatures.is_postgresql_12
10831028
django.db.backends.postgresql.features.DatabaseFeatures.is_postgresql_13
10841029
django.db.backends.postgresql.features.DatabaseFeatures.is_postgresql_14
10851030
django.db.backends.postgresql.features.DatabaseFeatures.prohibits_null_characters_in_text_exception
1086-
django.db.backends.postgresql.features.DatabaseFeatures.schema_editor_uses_clientside_param_binding
1087-
django.db.backends.postgresql.features.DatabaseFeatures.supports_comments
10881031
django.db.backends.postgresql.features.DatabaseFeatures.supports_covering_spgist_indexes
1089-
django.db.backends.postgresql.features.DatabaseFeatures.supports_unlimited_charfield
10901032
django.db.backends.postgresql.features.DatabaseFeatures.uses_server_side_binding
10911033
django.db.backends.postgresql.introspection.DatabaseIntrospection.index_default_access_method
10921034
django.db.backends.postgresql.introspection.FieldInfo
@@ -1105,24 +1047,19 @@ django.db.backends.sqlite3.base.SQLiteCursorWrapper.executemany
11051047
django.db.backends.sqlite3.base.adapt_date
11061048
django.db.backends.sqlite3.base.adapt_datetime
11071049
django.db.backends.sqlite3.base.check_sqlite_version
1108-
django.db.backends.sqlite3.creation.DatabaseCreation.setup_worker_connection
11091050
django.db.backends.sqlite3.features.DatabaseFeatures.can_alter_table_drop_column
11101051
django.db.backends.sqlite3.features.DatabaseFeatures.can_alter_table_rename_column
11111052
django.db.backends.sqlite3.features.DatabaseFeatures.can_introspect_json_field
11121053
django.db.backends.sqlite3.features.DatabaseFeatures.can_return_columns_from_insert
11131054
django.db.backends.sqlite3.features.DatabaseFeatures.can_return_rows_from_bulk_insert
1114-
django.db.backends.sqlite3.features.DatabaseFeatures.create_test_table_with_composite_primary_key
11151055
django.db.backends.sqlite3.features.DatabaseFeatures.django_test_skips
11161056
django.db.backends.sqlite3.features.DatabaseFeatures.has_json_object_function
11171057
django.db.backends.sqlite3.features.DatabaseFeatures.introspected_field_types
1118-
django.db.backends.sqlite3.features.DatabaseFeatures.requires_compound_order_by_subquery
11191058
django.db.backends.sqlite3.features.DatabaseFeatures.supports_atomic_references_rename
11201059
django.db.backends.sqlite3.features.DatabaseFeatures.supports_json_field
11211060
django.db.backends.sqlite3.introspection.FieldInfo
1122-
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.add_constraint
11231061
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.alter_db_table
11241062
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.delete_model
1125-
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.remove_constraint
11261063
django.db.backends.sqlite3.schema.DatabaseSchemaEditor.sql_create_fk
11271064
django.db.backends.utils.debug_transaction
11281065
django.db.backends.utils.names_digest

0 commit comments

Comments
 (0)