Skip to content

Commit e27bfc1

Browse files
authored
migration(grouphistory): Mark column for safe removal (#102788)
This is part of the process of removing a column from Sentry: https://develop.sentry.dev/backend/application-domains/database-migrations/#deleting-columns This is a follow-up to #102672.
1 parent c786570 commit e27bfc1

File tree

3 files changed

+34
-14
lines changed

3 files changed

+34
-14
lines changed

migrations_lockfile.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ releases: 0002_delete_dual_written_commit_tables
3131

3232
replays: 0006_add_bulk_delete_job
3333

34-
sentry: 1002_group_history_prev_history_remove_db_constraint
34+
sentry: 1003_group_history_prev_history_safe_removal
3535

3636
social_auth: 0003_social_auth_json_field
3737

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 5.2.1 on 2025-11-04 15:18
2+
3+
from sentry.new_migrations.migrations import CheckedMigration
4+
from sentry.new_migrations.monkey.fields import SafeRemoveField
5+
from sentry.new_migrations.monkey.state import DeletionAction
6+
7+
8+
class Migration(CheckedMigration):
9+
# This flag is used to mark that a migration shouldn't be automatically run in production.
10+
# This should only be used for operations where it's safe to run the migration after your
11+
# code has deployed. So this should not be used for most operations that alter the schema
12+
# of a table.
13+
# Here are some things that make sense to mark as post deployment:
14+
# - Large data migrations. Typically we want these to be run manually so that they can be
15+
# monitored and not block the deploy for a long period of time while they run.
16+
# - Adding indexes to large tables. Since this can take a long time, we'd generally prefer to
17+
# run this outside deployments so that we don't block them. Note that while adding an index
18+
# is a schema change, it's completely safe to run the operation after the code has deployed.
19+
# Once deployed, run these manually via: https://develop.sentry.dev/database-migrations/#migration-deployment
20+
21+
is_post_deployment = False
22+
23+
dependencies = [
24+
("sentry", "1002_group_history_prev_history_remove_db_constraint"),
25+
]
26+
27+
operations = [
28+
SafeRemoveField(
29+
model_name="grouphistory",
30+
name="prev_history",
31+
deletion_action=DeletionAction.MOVE_TO_PENDING,
32+
),
33+
]

src/sentry/models/grouphistory.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -212,19 +212,6 @@ class GroupHistory(Model):
212212
(GroupHistoryStatus.ESCALATING, _("Escalating")),
213213
),
214214
)
215-
prev_history = FlexibleForeignKey(
216-
"sentry.GroupHistory",
217-
null=True,
218-
on_delete=models.SET_NULL,
219-
# By default, Django creates a database-level foreign key constraint when you define a ForeignKey field.
220-
# This constraint enforces referential integrity at the database level, preventing you from:
221-
# * Deleting a referenced record without handling the reference
222-
# * Creating a reference to a non-existent record
223-
# When you set db_constraint=False, Django skips creating this database constraint.
224-
# The field still works as a ForeignKey in Python/Django (you can traverse relationships,
225-
# use .select_related(), etc.), but the database won't enforce the relationship.
226-
db_constraint=False,
227-
)
228215
prev_history_date = models.DateTimeField(
229216
null=True
230217
) # This field is used to simplify query calculations.

0 commit comments

Comments
 (0)