summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2022-01-04 05:50:00 +0100
committerGitHub <noreply@github.com>2022-01-04 05:50:00 +0100
commit30613d6a748fce18919ff8b0da166d9fda2ed9bc (patch)
treea3ddfcff5c655e490e6c9d87cf53fa8e15b899a2
parent0ab58c120939093fea90822f376e1866fc714d1f (diff)
Fixed #33408 -- Fixed adding nullable unique fields on SQLite.
Regression in 2f73e5406d54cb8945e187eff302a3a3373350be. Thanks Alan Crosswell for the report.
-rw-r--r--django/db/backends/sqlite3/schema.py13
-rw-r--r--tests/schema/tests.py12
2 files changed, 21 insertions, 4 deletions
diff --git a/django/db/backends/sqlite3/schema.py b/django/db/backends/sqlite3/schema.py
index 6752a8e3c0..3ff0a3f7db 100644
--- a/django/db/backends/sqlite3/schema.py
+++ b/django/db/backends/sqlite3/schema.py
@@ -324,10 +324,15 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
def add_field(self, model, field):
"""Create a field on a model."""
- # Fields with default values cannot by handled by ALTER TABLE ADD
- # COLUMN statement because DROP DEFAULT is not supported in
- # ALTER TABLE.
- if not field.null or self.effective_default(field) is not None:
+ if (
+ # Primary keys and unique fields are not supported in ALTER TABLE
+ # ADD COLUMN.
+ field.primary_key or field.unique or
+ # Fields with default values cannot by handled by ALTER TABLE ADD
+ # COLUMN statement because DROP DEFAULT is not supported in
+ # ALTER TABLE.
+ not field.null or self.effective_default(field) is not None
+ ):
self._remake_table(model, create_field=field)
else:
super().add_field(model, field)
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index cd6a52f6af..60e69503cc 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -624,6 +624,18 @@ class SchemaTests(TransactionTestCase):
# Make sure the values were transformed correctly
self.assertEqual(Author.objects.extra(where=["thing = 1"]).count(), 2)
+ def test_add_field_o2o_nullable(self):
+ with connection.schema_editor() as editor:
+ editor.create_model(Author)
+ editor.create_model(Note)
+ new_field = OneToOneField(Note, CASCADE, null=True)
+ new_field.set_attributes_from_name('note')
+ with connection.schema_editor() as editor:
+ editor.add_field(Author, new_field)
+ columns = self.column_classes(Author)
+ self.assertIn('note_id', columns)
+ self.assertTrue(columns['note_id'][1][6])
+
def test_add_field_binary(self):
"""
Tests binary fields get a sane default (#22851)