Generate Django Database Migrations
Commands
Generate migrations automatically based on model changes:
sentry django makemigrations
For a specific app:
sentry django makemigrations <app_name>
Generate an empty migration (for data migrations or custom work):
sentry django makemigrations <app_name> --empty
After Generating
-
If you added a new model, ensure it's imported in the app's init.py
-
Review the generated migration for correctness
-
Run sentry django sqlmigrate <app_name> <migration_name> to verify the SQL
Guidelines
Adding Columns
-
Use db_default=<value> instead of default=<value> for columns with defaults
-
Nullable columns: use null=True
-
Not null columns: must have db_default set
Adding Indexes
For large tables, set is_post_deployment = True on the migration as index creation may exceed the 5s timeout.
Deleting Columns
-
Make column nullable (null=True ) if not already
-
Remove all code references
-
Replace RemoveField with SafeRemoveField(..., deletion_action=DeletionAction.MOVE_TO_PENDING)
-
Deploy, then create second migration with SafeRemoveField(..., deletion_action=DeletionAction.DELETE)
Deleting Tables
-
Remove all code references
-
Replace DeleteModel with SafeDeleteModel(..., deletion_action=DeletionAction.MOVE_TO_PENDING)
-
Deploy, then create second migration with SafeDeleteModel(..., deletion_action=DeletionAction.DELETE)
Renaming Columns/Tables
Don't rename in Postgres. Use db_column or Meta.db_table to keep the old name.
Resolving Merge Conflicts
If migrations_lockfile.txt conflicts:
bin/update-migration <migration_name>
This renames your migration, updates dependencies, and fixes the lockfile.