From d69b23a2a21114b1dcf9be58b51dee226fc480f7 Mon Sep 17 00:00:00 2001 From: Henrik Ek Date: Fri, 17 Apr 2020 18:17:18 +0200 Subject: [PATCH 1/3] Exclude indexs when delete unique constrains --- sql_server/pyodbc/schema.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/sql_server/pyodbc/schema.py b/sql_server/pyodbc/schema.py index 2bd2dcc5..b1edd0ad 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 @@ -926,7 +932,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), From 4fe0d291a7380e540997709db262a05148504d26 Mon Sep 17 00:00:00 2001 From: Henrik Ek Date: Mon, 20 Apr 2020 15:17:09 +0200 Subject: [PATCH 2/3] Add test models and migrations --- .../0006_test_remove_onetoone_field_part1.py | 22 +++++++++++++++++++ .../0007_test_remove_onetoone_field_part2.py | 17 ++++++++++++++ testapp/models.py | 7 ++++++ 3 files changed, 46 insertions(+) create mode 100644 testapp/migrations/0006_test_remove_onetoone_field_part1.py create mode 100644 testapp/migrations/0007_test_remove_onetoone_field_part2.py 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..03b979bb 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. + a = models.CharField(max_length=50) + #b = models.OneToOneField('self', on_delete=models.SET_NULL, null=True) From 63eb5c188671d53d4d1cde238e49723f1c7b685b Mon Sep 17 00:00:00 2001 From: Henrik Ek Date: Mon, 20 Apr 2020 22:29:47 +0200 Subject: [PATCH 3/3] Fix flake8 lint --- testapp/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testapp/models.py b/testapp/models.py index 03b979bb..c87f797b 100644 --- a/testapp/models.py +++ b/testapp/models.py @@ -69,5 +69,5 @@ class Meta: 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) - #b = models.OneToOneField('self', on_delete=models.SET_NULL, null=True)