summaryrefslogtreecommitdiff
path: root/django/db/backends/sqlite3/schema.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/backends/sqlite3/schema.py')
-rw-r--r--django/db/backends/sqlite3/schema.py104
1 files changed, 1 insertions, 103 deletions
diff --git a/django/db/backends/sqlite3/schema.py b/django/db/backends/sqlite3/schema.py
index 46ba07092d..ec128fd733 100644
--- a/django/db/backends/sqlite3/schema.py
+++ b/django/db/backends/sqlite3/schema.py
@@ -7,7 +7,6 @@ from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.ddl_references import Statement
from django.db.backends.utils import strip_quotes
from django.db.models import NOT_PROVIDED, UniqueConstraint
-from django.db.transaction import atomic
class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
@@ -73,105 +72,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
def prepare_default(self, value):
return self.quote_value(value)
- def _is_referenced_by_fk_constraint(
- self, table_name, column_name=None, ignore_self=False
- ):
- """
- Return whether or not the provided table name is referenced by another
- one. If `column_name` is specified, only references pointing to that
- column are considered. If `ignore_self` is True, self-referential
- constraints are ignored.
- """
- with self.connection.cursor() as cursor:
- for other_table in self.connection.introspection.get_table_list(cursor):
- if ignore_self and other_table.name == table_name:
- continue
- relations = self.connection.introspection.get_relations(
- cursor, other_table.name
- )
- for constraint_column, constraint_table in relations.values():
- if constraint_table == table_name and (
- column_name is None or constraint_column == column_name
- ):
- return True
- return False
-
- def alter_db_table(
- self, model, old_db_table, new_db_table, disable_constraints=True
- ):
- if (
- not self.connection.features.supports_atomic_references_rename
- and disable_constraints
- and self._is_referenced_by_fk_constraint(old_db_table)
- ):
- if self.connection.in_atomic_block:
- raise NotSupportedError(
- (
- "Renaming the %r table while in a transaction is not "
- "supported on SQLite < 3.26 because it would break referential "
- "integrity. Try adding `atomic = False` to the Migration class."
- )
- % old_db_table
- )
- self.connection.enable_constraint_checking()
- super().alter_db_table(model, old_db_table, new_db_table)
- self.connection.disable_constraint_checking()
- else:
- super().alter_db_table(model, old_db_table, new_db_table)
-
- def alter_field(self, model, old_field, new_field, strict=False):
- if not self._field_should_be_altered(old_field, new_field):
- return
- old_field_name = old_field.name
- table_name = model._meta.db_table
- _, old_column_name = old_field.get_attname_column()
- if (
- new_field.name != old_field_name
- and not self.connection.features.supports_atomic_references_rename
- and self._is_referenced_by_fk_constraint(
- table_name, old_column_name, ignore_self=True
- )
- ):
- if self.connection.in_atomic_block:
- raise NotSupportedError(
- (
- "Renaming the %r.%r column while in a transaction is not "
- "supported on SQLite < 3.26 because it would break referential "
- "integrity. Try adding `atomic = False` to the Migration class."
- )
- % (model._meta.db_table, old_field_name)
- )
- with atomic(self.connection.alias):
- super().alter_field(model, old_field, new_field, strict=strict)
- # Follow SQLite's documented procedure for performing changes
- # that don't affect the on-disk content.
- # https://sqlite.org/lang_altertable.html#otheralter
- with self.connection.cursor() as cursor:
- schema_version = cursor.execute("PRAGMA schema_version").fetchone()[
- 0
- ]
- cursor.execute("PRAGMA writable_schema = 1")
- references_template = ' REFERENCES "%s" ("%%s") ' % table_name
- new_column_name = new_field.get_attname_column()[1]
- search = references_template % old_column_name
- replacement = references_template % new_column_name
- cursor.execute(
- "UPDATE sqlite_master SET sql = replace(sql, %s, %s)",
- (search, replacement),
- )
- cursor.execute("PRAGMA schema_version = %d" % (schema_version + 1))
- cursor.execute("PRAGMA writable_schema = 0")
- # The integrity check will raise an exception and rollback
- # the transaction if the sqlite_master updates corrupt the
- # database.
- cursor.execute("PRAGMA integrity_check")
- # Perform a VACUUM to refresh the database representation from
- # the sqlite_master table.
- with self.connection.cursor() as cursor:
- cursor.execute("VACUUM")
- else:
- super().alter_field(model, old_field, new_field, strict=strict)
-
def _remake_table(
self, model, create_field=None, delete_field=None, alter_fields=None
):
@@ -358,7 +258,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
new_model,
new_model._meta.db_table,
model._meta.db_table,
- disable_constraints=False,
)
# Run deferred SQL on correct table
@@ -458,8 +357,7 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
# Use "ALTER TABLE ... RENAME COLUMN" if only the column name
# changed and there aren't any constraints.
if (
- self.connection.features.can_alter_table_rename_column
- and old_field.column != new_field.column
+ old_field.column != new_field.column
and self.column_sql(model, old_field) == self.column_sql(model, new_field)
and not (
old_field.remote_field