Skip to content

Commit aed0b68

Browse files
ref: fix more schema drift by setting more db_defaults (#90327)
<!-- Describe your PR here. -->
1 parent a48629e commit aed0b68

File tree

11 files changed

+151
-12
lines changed

11 files changed

+151
-12
lines changed

migrations_lockfile.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ remote_subscriptions: 0003_drop_remote_subscription
2121

2222
replays: 0004_index_together
2323

24-
sentry: 0868_delete_group_open_periods
24+
sentry: 0869_fix_drift_db_default_pt2
2525

2626
social_auth: 0002_default_auto_field
2727

src/sentry/hybridcloud/models/outbox.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from django import db
1212
from django.db import OperationalError, connections, models, router, transaction
1313
from django.db.models import Count, Max, Min
14+
from django.db.models.functions import Now
1415
from django.db.transaction import Atomic
1516
from django.utils import timezone
1617
from sentry_sdk.tracing import Span
@@ -177,7 +178,9 @@ class Meta:
177178
scheduled_for = models.DateTimeField(null=False, default=THE_PAST)
178179

179180
# Initial creation date for the outbox which should not be modified. Used for lag time calculation.
180-
date_added = models.DateTimeField(null=False, default=timezone.now, editable=False)
181+
date_added = models.DateTimeField(
182+
null=False, default=timezone.now, db_default=Now(), editable=False
183+
)
181184

182185
def last_delay(self) -> datetime.timedelta:
183186
return max(self.scheduled_for - self.scheduled_from, datetime.timedelta(seconds=1))

src/sentry/incidents/models/alert_rule.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,9 @@ class AlertRuleTriggerAction(AbstractNotificationAction):
465465
dict[str, Any] | list[dict[str, Any]] | None,
466466
] = JSONField(null=True)
467467
status = BoundedPositiveIntegerField(
468-
default=ObjectStatus.ACTIVE, choices=ObjectStatus.as_choices()
468+
default=ObjectStatus.ACTIVE,
469+
db_default=ObjectStatus.ACTIVE,
470+
choices=ObjectStatus.as_choices(),
469471
)
470472

471473
class Meta:
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# Generated by Django 5.1.7 on 2025-04-24 19:56
2+
3+
import django.db.models.functions.datetime
4+
import django.utils.timezone
5+
from django.db import migrations, models
6+
7+
import sentry.db.models.fields.bounded
8+
from sentry.new_migrations.migrations import CheckedMigration
9+
10+
11+
class Migration(CheckedMigration):
12+
# This flag is used to mark that a migration shouldn't be automatically run in production.
13+
# This should only be used for operations where it's safe to run the migration after your
14+
# code has deployed. So this should not be used for most operations that alter the schema
15+
# of a table.
16+
# Here are some things that make sense to mark as post deployment:
17+
# - Large data migrations. Typically we want these to be run manually so that they can be
18+
# monitored and not block the deploy for a long period of time while they run.
19+
# - Adding indexes to large tables. Since this can take a long time, we'd generally prefer to
20+
# run this outside deployments so that we don't block them. Note that while adding an index
21+
# is a schema change, it's completely safe to run the operation after the code has deployed.
22+
# Once deployed, run these manually via: https://develop.sentry.dev/database-migrations/#migration-deployment
23+
24+
is_post_deployment = False
25+
26+
dependencies = [
27+
("sentry", "0868_delete_group_open_periods"),
28+
]
29+
30+
operations = [
31+
migrations.AlterField(
32+
model_name="alertruletriggeraction",
33+
name="status",
34+
field=sentry.db.models.fields.bounded.BoundedPositiveIntegerField(
35+
db_default=0, default=0
36+
),
37+
),
38+
migrations.AlterField(
39+
model_name="authidentityreplica",
40+
name="last_verified",
41+
field=models.DateTimeField(
42+
db_default=django.db.models.functions.datetime.Now(),
43+
default=django.utils.timezone.now,
44+
),
45+
),
46+
migrations.AlterField(
47+
model_name="controloutbox",
48+
name="date_added",
49+
field=models.DateTimeField(
50+
db_default=django.db.models.functions.datetime.Now(),
51+
default=django.utils.timezone.now,
52+
editable=False,
53+
),
54+
),
55+
migrations.AlterField(
56+
model_name="dashboardwidgetquery",
57+
name="date_modified",
58+
field=models.DateTimeField(
59+
db_default=django.db.models.functions.datetime.Now(),
60+
default=django.utils.timezone.now,
61+
),
62+
),
63+
migrations.AlterField(
64+
model_name="dashboardwidgetqueryondemand",
65+
name="date_added",
66+
field=models.DateTimeField(
67+
db_default=django.db.models.functions.datetime.Now(),
68+
default=django.utils.timezone.now,
69+
),
70+
),
71+
migrations.AlterField(
72+
model_name="group",
73+
name="type",
74+
field=sentry.db.models.fields.bounded.BoundedPositiveIntegerField(
75+
db_default=1, db_index=True, default=1
76+
),
77+
),
78+
migrations.AlterField(
79+
model_name="perfstringindexer",
80+
name="use_case_id",
81+
field=models.CharField(db_default="performance", default="performance", max_length=120),
82+
),
83+
migrations.AlterField(
84+
model_name="projectdebugfile",
85+
name="date_accessed",
86+
field=models.DateTimeField(
87+
db_default=django.db.models.functions.datetime.Now(),
88+
default=django.utils.timezone.now,
89+
),
90+
),
91+
migrations.AlterField(
92+
model_name="projectownership",
93+
name="suspect_committer_auto_assignment",
94+
field=models.BooleanField(db_default=False, default=False),
95+
),
96+
migrations.AlterField(
97+
model_name="regionoutbox",
98+
name="date_added",
99+
field=models.DateTimeField(
100+
db_default=django.db.models.functions.datetime.Now(),
101+
default=django.utils.timezone.now,
102+
editable=False,
103+
),
104+
),
105+
migrations.AlterField(
106+
model_name="user",
107+
name="avatar_type",
108+
field=models.PositiveSmallIntegerField(db_default=0, default=0),
109+
),
110+
migrations.AlterField(
111+
model_name="user",
112+
name="avatar_url",
113+
field=models.CharField(db_default=None, default=None, max_length=120, null=True),
114+
),
115+
migrations.AlterField(
116+
model_name="user",
117+
name="is_unclaimed",
118+
field=models.BooleanField(db_default=False, default=False),
119+
),
120+
]

src/sentry/models/authidentityreplica.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import Any
44

55
from django.db import models
6+
from django.db.models.functions import Now
67
from django.utils import timezone
78

89
from sentry.backup.scopes import RelocationScope
@@ -22,7 +23,7 @@ class AuthIdentityReplica(Model):
2223
auth_provider_id = HybridCloudForeignKey("sentry.AuthProvider", on_delete="CASCADE")
2324
ident = models.CharField(max_length=128)
2425
data: models.Field[dict[str, Any], dict[str, Any]] = JSONField()
25-
last_verified = models.DateTimeField(default=timezone.now)
26+
last_verified = models.DateTimeField(default=timezone.now, db_default=Now())
2627

2728
# This represents the time at which this model was created, NOT the date_added of the original auth identity
2829
# we are replicating from.

src/sentry/models/dashboard_widget.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from django.contrib.postgres.fields import ArrayField as DjangoArrayField
77
from django.db import models
8+
from django.db.models.functions import Now
89
from django.utils import timezone
910
from django.utils.translation import gettext_lazy
1011

@@ -171,7 +172,7 @@ class DashboardWidgetQuery(Model):
171172
# Order of the widget query in the widget.
172173
order = BoundedPositiveIntegerField()
173174
date_added = models.DateTimeField(default=timezone.now)
174-
date_modified = models.DateTimeField(default=timezone.now)
175+
date_modified = models.DateTimeField(default=timezone.now, db_default=Now())
175176
# Whether this query is hidden from the UI, used by metric widgets
176177
is_hidden = models.BooleanField(default=False, db_default=False)
177178
# Used by Big Number to select aggregate displayed
@@ -222,7 +223,7 @@ class OnDemandExtractionState(models.TextChoices):
222223
spec_version = models.IntegerField(null=True)
223224
extraction_state = models.CharField(max_length=30, choices=OnDemandExtractionState.choices)
224225
date_modified = models.DateTimeField(default=timezone.now)
225-
date_added = models.DateTimeField(default=timezone.now)
226+
date_added = models.DateTimeField(default=timezone.now, db_default=Now())
226227

227228
def can_extraction_be_auto_overridden(self):
228229
"""Determines whether tasks can override extraction state"""

src/sentry/models/debugfile.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from django.db import models
1818
from django.db.models import Q
19+
from django.db.models.functions import Now
1920
from django.utils import timezone
2021
from symbolic.debuginfo import Archive, BcSymbolMap, Object, UuidMapping, normalize_debug_id
2122
from symbolic.exceptions import ObjectErrorUnsupportedObject, SymbolicError
@@ -130,7 +131,7 @@ class ProjectDebugFile(Model):
130131
debug_id = models.CharField(max_length=64, db_column="uuid")
131132
code_id = models.CharField(max_length=64, null=True)
132133
data: models.Field[dict[str, Any] | None, dict[str, Any] | None] = JSONField(null=True)
133-
date_accessed = models.DateTimeField(default=timezone.now)
134+
date_accessed = models.DateTimeField(default=timezone.now, db_default=Now())
134135

135136
objects: ClassVar[ProjectDebugFileManager] = ProjectDebugFileManager()
136137

src/sentry/models/group.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,9 @@ class Group(Model):
597597
blank=True, null=True
598598
)
599599
short_id = BoundedBigIntegerField(null=True)
600-
type = BoundedPositiveIntegerField(default=DEFAULT_TYPE_ID, db_index=True)
600+
type = BoundedPositiveIntegerField(
601+
default=DEFAULT_TYPE_ID, db_default=DEFAULT_TYPE_ID, db_index=True
602+
)
601603
priority = models.PositiveSmallIntegerField(null=True)
602604
priority_locked_at = models.DateTimeField(null=True)
603605

src/sentry/models/projectownership.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class ProjectOwnership(Model):
4848
last_updated = models.DateTimeField(default=timezone.now)
4949
is_active = models.BooleanField(default=True)
5050
codeowners_auto_sync = models.BooleanField(default=True, null=True)
51-
suspect_committer_auto_assignment = models.BooleanField(default=False)
51+
suspect_committer_auto_assignment = models.BooleanField(default=False, db_default=False)
5252

5353
class Meta:
5454
app_label = "sentry"

src/sentry/sentry_metrics/indexer/postgres/models.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ class Meta:
4444
@region_silo_model
4545
class PerfStringIndexer(BaseIndexer):
4646
__relocation_scope__ = RelocationScope.Excluded
47-
use_case_id = models.CharField(max_length=120)
47+
use_case_id = models.CharField(
48+
max_length=120,
49+
default=UseCaseKey.PERFORMANCE.value,
50+
db_default=UseCaseKey.PERFORMANCE.value,
51+
)
4852

4953
class Meta:
5054
db_table = "sentry_perfstringindexer"

0 commit comments

Comments
 (0)