Skip to content

Commit 31aadfa

Browse files
wedamijaevanh
authored andcommitted
feat(migrations): Add in SafeDeleteColumn migration operation (#81098)
This builds on #81063 This adds in `SafeDeleteColumn`, which works the same way as `SafeDeleteModel`, except on database columns. It performs checks that the column doesn't have a db constraint set, and also that it is either nullable or has a db_default set. Similarly to `SafeDeleteModel` we still need to be careful to make sure that the pending deletion merges and deploys first, and then the real deletion.
1 parent 471491b commit 31aadfa

File tree

44 files changed

+753
-12
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+753
-12
lines changed

fixtures/safe_migrations_apps/bad_flow_delete_field_double_pending_app/__init__.py

Whitespace-only changes.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 3.1 on 2019-09-22 21:47
2+
3+
from django.db import migrations, models
4+
5+
from sentry.new_migrations.migrations import CheckedMigration
6+
7+
8+
class Migration(CheckedMigration):
9+
10+
initial = True
11+
12+
dependencies = []
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name="TestTable",
17+
fields=[
18+
(
19+
"id",
20+
models.AutoField(
21+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
22+
),
23+
),
24+
("field", models.IntegerField(null=True)),
25+
],
26+
),
27+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from sentry.new_migrations.migrations import CheckedMigration
2+
from sentry.new_migrations.monkey.fields import SafeRemoveField
3+
from sentry.new_migrations.monkey.state import DeletionAction
4+
5+
6+
class Migration(CheckedMigration):
7+
8+
dependencies = [
9+
("bad_flow_delete_field_double_pending_app", "0001_initial"),
10+
]
11+
12+
operations = [
13+
SafeRemoveField(
14+
model_name="testtable",
15+
name="field",
16+
deletion_action=DeletionAction.MOVE_TO_PENDING,
17+
),
18+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from sentry.new_migrations.migrations import CheckedMigration
2+
from sentry.new_migrations.monkey.fields import SafeRemoveField
3+
from sentry.new_migrations.monkey.state import DeletionAction
4+
5+
6+
class Migration(CheckedMigration):
7+
8+
dependencies = [
9+
("bad_flow_delete_field_double_pending_app", "0002_delete_pending"),
10+
]
11+
12+
operations = [
13+
SafeRemoveField(
14+
model_name="testtable",
15+
name="field",
16+
deletion_action=DeletionAction.MOVE_TO_PENDING,
17+
),
18+
]

fixtures/safe_migrations_apps/bad_flow_delete_field_double_pending_app/migrations/__init__.py

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.db import models
2+
3+
4+
class TestTable(models.Model):
5+
field = models.IntegerField(default=0, null=False)

fixtures/safe_migrations_apps/bad_flow_delete_field_pending_with_fk_constraint_app/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import django
2+
from django.db import migrations, models
3+
4+
import sentry
5+
from sentry.new_migrations.migrations import CheckedMigration
6+
7+
8+
class Migration(CheckedMigration):
9+
10+
initial = True
11+
12+
dependencies = []
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name="FkTable",
17+
fields=[
18+
(
19+
"id",
20+
models.AutoField(
21+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
22+
),
23+
),
24+
],
25+
),
26+
migrations.CreateModel(
27+
name="TestTable",
28+
fields=[
29+
(
30+
"id",
31+
models.AutoField(
32+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
33+
),
34+
),
35+
(
36+
"fk_table",
37+
sentry.db.models.fields.foreignkey.FlexibleForeignKey(
38+
on_delete=django.db.models.deletion.CASCADE,
39+
to="bad_flow_delete_field_pending_with_fk_constraint_app.fktable",
40+
db_index=False,
41+
),
42+
),
43+
],
44+
),
45+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from sentry.new_migrations.migrations import CheckedMigration
2+
from sentry.new_migrations.monkey.fields import SafeRemoveField
3+
from sentry.new_migrations.monkey.state import DeletionAction
4+
5+
6+
class Migration(CheckedMigration):
7+
atomic = False
8+
9+
dependencies = [
10+
("bad_flow_delete_field_pending_with_fk_constraint_app", "0001_initial"),
11+
]
12+
13+
operations = [
14+
SafeRemoveField(
15+
model_name="testtable",
16+
name="fk_table",
17+
deletion_action=DeletionAction.MOVE_TO_PENDING,
18+
),
19+
]

fixtures/safe_migrations_apps/bad_flow_delete_field_pending_with_fk_constraint_app/migrations/__init__.py

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from django.db import models
2+
3+
from sentry.db.models import FlexibleForeignKey
4+
5+
6+
class FkTable(models.Model):
7+
field = models.IntegerField(default=0, null=False)
8+
9+
10+
class TestTable(models.Model):
11+
field = models.IntegerField(default=0, null=False)
12+
fk_table = FlexibleForeignKey(FkTable, db_index=False)

fixtures/safe_migrations_apps/bad_flow_delete_field_pending_with_not_null_app/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from django.db import migrations, models
2+
3+
from sentry.new_migrations.migrations import CheckedMigration
4+
5+
6+
class Migration(CheckedMigration):
7+
8+
initial = True
9+
10+
dependencies = []
11+
12+
operations = [
13+
migrations.CreateModel(
14+
name="TestTable",
15+
fields=[
16+
(
17+
"id",
18+
models.AutoField(
19+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
20+
),
21+
),
22+
("field", models.IntegerField()),
23+
],
24+
),
25+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from sentry.new_migrations.migrations import CheckedMigration
2+
from sentry.new_migrations.monkey.fields import SafeRemoveField
3+
from sentry.new_migrations.monkey.state import DeletionAction
4+
5+
6+
class Migration(CheckedMigration):
7+
dependencies = [
8+
("bad_flow_delete_field_pending_with_not_null_app", "0001_initial"),
9+
]
10+
11+
operations = [
12+
SafeRemoveField(
13+
model_name="testtable",
14+
name="field",
15+
deletion_action=DeletionAction.MOVE_TO_PENDING,
16+
),
17+
]

fixtures/safe_migrations_apps/bad_flow_delete_field_pending_with_not_null_app/migrations/__init__.py

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.db import models
2+
3+
4+
class TestTable(models.Model):
5+
field = models.IntegerField(default=0, null=False)

fixtures/safe_migrations_apps/bad_flow_delete_field_without_pending_app/__init__.py

Whitespace-only changes.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 3.1 on 2019-09-22 21:47
2+
3+
from django.db import migrations, models
4+
5+
from sentry.new_migrations.migrations import CheckedMigration
6+
7+
8+
class Migration(CheckedMigration):
9+
10+
initial = True
11+
12+
dependencies = []
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name="TestTable",
17+
fields=[
18+
(
19+
"id",
20+
models.AutoField(
21+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
22+
),
23+
),
24+
("field", models.IntegerField()),
25+
],
26+
),
27+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from sentry.new_migrations.migrations import CheckedMigration
2+
from sentry.new_migrations.monkey.fields import SafeRemoveField
3+
from sentry.new_migrations.monkey.state import DeletionAction
4+
5+
6+
class Migration(CheckedMigration):
7+
8+
dependencies = [
9+
("bad_flow_delete_field_without_pending_app", "0001_initial"),
10+
]
11+
12+
operations = [
13+
SafeRemoveField(
14+
model_name="testtable",
15+
name="field",
16+
deletion_action=DeletionAction.DELETE,
17+
),
18+
]

fixtures/safe_migrations_apps/bad_flow_delete_field_without_pending_app/migrations/__init__.py

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.db import models
2+
3+
4+
class TestTable(models.Model):
5+
field = models.IntegerField(default=0, null=False)

fixtures/safe_migrations_apps/good_flow_delete_field_pending_with_fk_constraint_app/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Generated by Django 3.1 on 2019-09-22 21:47
2+
import django
3+
from django.db import migrations, models
4+
5+
import sentry
6+
from sentry.new_migrations.migrations import CheckedMigration
7+
8+
9+
class Migration(CheckedMigration):
10+
11+
initial = True
12+
13+
dependencies = []
14+
15+
operations = [
16+
migrations.CreateModel(
17+
name="FkTable",
18+
fields=[
19+
(
20+
"id",
21+
models.AutoField(
22+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
23+
),
24+
),
25+
],
26+
),
27+
migrations.CreateModel(
28+
name="TestTable",
29+
fields=[
30+
(
31+
"id",
32+
models.AutoField(
33+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
34+
),
35+
),
36+
(
37+
"fk_table",
38+
sentry.db.models.fields.foreignkey.FlexibleForeignKey(
39+
on_delete=django.db.models.deletion.CASCADE,
40+
to="good_flow_delete_field_pending_with_fk_constraint_app.fktable",
41+
db_index=False,
42+
null=True,
43+
),
44+
),
45+
],
46+
),
47+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import django
2+
from django.db import migrations
3+
4+
import sentry
5+
from sentry.new_migrations.migrations import CheckedMigration
6+
from sentry.new_migrations.monkey.fields import SafeRemoveField
7+
from sentry.new_migrations.monkey.state import DeletionAction
8+
9+
10+
class Migration(CheckedMigration):
11+
atomic = False
12+
13+
dependencies = [
14+
("good_flow_delete_field_pending_with_fk_constraint_app", "0001_initial"),
15+
]
16+
17+
operations = [
18+
migrations.AlterField(
19+
model_name="TestTable",
20+
name="fk_table",
21+
field=sentry.db.models.fields.foreignkey.FlexibleForeignKey(
22+
on_delete=django.db.models.deletion.CASCADE,
23+
to="good_flow_delete_field_pending_with_fk_constraint_app.fktable",
24+
db_index=False,
25+
db_constraint=False,
26+
null=True,
27+
),
28+
),
29+
SafeRemoveField(
30+
model_name="testtable",
31+
name="fk_table",
32+
deletion_action=DeletionAction.MOVE_TO_PENDING,
33+
),
34+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from sentry.new_migrations.migrations import CheckedMigration
2+
from sentry.new_migrations.monkey.fields import SafeRemoveField
3+
from sentry.new_migrations.monkey.state import DeletionAction
4+
5+
6+
class Migration(CheckedMigration):
7+
dependencies = [
8+
(
9+
"good_flow_delete_field_pending_with_fk_constraint_app",
10+
"0002_remove_constraints_and_pending",
11+
),
12+
]
13+
14+
operations = [
15+
SafeRemoveField(
16+
model_name="testtable",
17+
name="fk_table",
18+
deletion_action=DeletionAction.DELETE,
19+
),
20+
]

fixtures/safe_migrations_apps/good_flow_delete_field_pending_with_fk_constraint_app/migrations/__init__.py

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from django.db import models
2+
3+
from sentry.db.models import FlexibleForeignKey
4+
5+
6+
class FkTable(models.Model):
7+
field = models.IntegerField(default=0, null=False)
8+
9+
10+
class TestTable(models.Model):
11+
field = models.IntegerField(default=0, null=False)
12+
fk_table = FlexibleForeignKey(FkTable, null=True, db_index=False)

fixtures/safe_migrations_apps/good_flow_delete_field_pending_with_not_null_app/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)