# Apply Database Schema Changes for Django

## Summary
Apply database schema changes for a Django app on Ample with a release command. `python3 manage.py migrate` runs against the injected DATABASE_URL before the new release goes live, and the release fails instead of activating if the migration fails.

## Workflow Steps

### 1. Write an Idempotent Migration
Create tables and markers with IF NOT EXISTS or a migration framework so a re-run is safe.

### 2. Deploy with the Release Command
Ample runs the command before activation; a non-zero exit fails the release.
Command: `ample deploy . --name <name> --public --start "python3 run.py" --release-command "python3 manage.py migrate"`

### 3. Verify the Marker Through the App
Serve a route (/migrated) that reads something only the migration creates.

### 4. Verify
Fetch the live URL and run the success checks below. On failure read the build log, then the runtime log, fix the cause and deploy again; do not blind-retry.
Command: `ample logs <log-identifier> --kind build`

## Prerequisites
- A migration command that reads DATABASE_URL and exits non-zero on failure
- A PostgreSQL database (supplied or managed)
- An Ample account token with `servers:write` and `databases:read`

## Tested Configuration
- **Template**: python-3.12
- **Runtime**: python
- **Size**: s-1vcpu-1gb
- **Install**: `python3 -m pip install --target .ample/python -r requirements.txt`
- **Start**: `PYTHONPATH=.ample/python:${PYTHONPATH:-} python3 run.py`

## Success Checks
- **Check**: migration marker is readable
  - **Kind**: http_get
  - **Path**: /migrated
  - **Expect**: migrated=release-ok

## Limitations
- Verified on the node-22 template at s-1vcpu-1gb; other templates and sizes are not verified by this recipe.
- Region, compliance attestations and request-duration limits are unknown and not claimed.
- Apps auto-pause when idle and wake on the next request; always-on is an operator setting, not a plan feature.
- Managed PostgreSQL 16 only; extensions, connection limits and backup or restore procedures are not verified.
- Apps and their managed databases are placed together; cross-node shared databases are unsupported.
- The release command runs once per release on the app VM; there is no separate migration runner or rollback of a partially applied migration.

## Cost Estimate
- **Currency**: USD
- **Monthly Amount**: 10.0
- **Basis**: size prices from pricing.toml (loaded by the API) at build revision 1ac5595375130d45290090e82ed0f554ccd45405-dirty
  - **Components**:
    - **App Server**: s-1vcpu-1gb - $5.00
    - **Managed PostgreSQL Database**: s-1vcpu-1gb - $5.00
- **Note**: Apps and managed databases auto-pause when idle; the estimate is the always-on monthly price of the tested sizes. Plan quotas and budgets apply.

## Examples
- **Django Release-command Canary**: `python3 manage.py migrate` runs before activation against the auto-provisioned managed database.

## Additional Information
- For detailed documentation, visit [here](/content/guides/django/schema-changes/index.html).
