diff --git a/sql_server/pyodbc/schema.py b/sql_server/pyodbc/schema.py index cf75b27b..9abcbd04 100644 --- a/sql_server/pyodbc/schema.py +++ b/sql_server/pyodbc/schema.py @@ -2,10 +2,16 @@ import datetime from django.db.backends.base.schema import ( - BaseDatabaseSchemaEditor, logger, _is_relevant_relation, _related_non_m2m_objects, + BaseDatabaseSchemaEditor, + _is_relevant_relation, + _related_non_m2m_objects, + logger, ) from django.db.backends.ddl_references import ( - Columns, IndexName, Statement as DjStatement, Table, + Columns, + IndexName, + Statement as DjStatement, + Table, ) from django.db.models import Index from django.db.models.fields import AutoField, BigAutoField @@ -935,7 +941,8 @@ def remove_field(self, model, field): }) # Drop unique constraints, SQL Server requires explicit deletion for name, infodict in constraints.items(): - if field.column in infodict['columns'] and infodict['unique'] and not infodict['primary_key']: + if (field.column in infodict['columns'] and infodict['unique'] and + not infodict['primary_key'] and not infodict['index']): self.execute(self.sql_delete_unique % { "table": self.quote_name(model._meta.db_table), "name": self.quote_name(name), diff --git a/testapp/migrations/0006_test_remove_onetoone_field_part1.py b/testapp/migrations/0006_test_remove_onetoone_field_part1.py new file mode 100644 index 00000000..e7e61473 --- /dev/null +++ b/testapp/migrations/0006_test_remove_onetoone_field_part1.py @@ -0,0 +1,22 @@ +# Generated by Django 3.0.4 on 2020-04-20 14:59 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('testapp', '0005_test_issue45_unique_type_change_part2'), + ] + + operations = [ + migrations.CreateModel( + name='TestRemoveOneToOneFieldModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('a', models.CharField(max_length=50)), + ('b', models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='testapp.TestRemoveOneToOneFieldModel')), + ], + ), + ] diff --git a/testapp/migrations/0007_test_remove_onetoone_field_part2.py b/testapp/migrations/0007_test_remove_onetoone_field_part2.py new file mode 100644 index 00000000..cc64ff69 --- /dev/null +++ b/testapp/migrations/0007_test_remove_onetoone_field_part2.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0.4 on 2020-04-20 14:59 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('testapp', '0006_test_remove_onetoone_field_part1'), + ] + + operations = [ + migrations.RemoveField( + model_name='testremoveonetoonefieldmodel', + name='b', + ), + ] diff --git a/testapp/models.py b/testapp/models.py index 7b993165..c87f797b 100644 --- a/testapp/models.py +++ b/testapp/models.py @@ -64,3 +64,10 @@ class Meta: a = models.CharField(max_length=51, null=True) b = models.CharField(max_length=50) c = models.CharField(max_length=50) + + +class TestRemoveOneToOneFieldModel(models.Model): + # Fields used for testing removing OneToOne field. Verifies that delete_unique do not try to remove indexes + # thats already is removed. + # b = models.OneToOneField('self', on_delete=models.SET_NULL, null=True) + a = models.CharField(max_length=50)