# Apply Database Schema Changes for Flask

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

## Resource Requirements
- **Compute**
- **Postgres**

## 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

## 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.  
   ```bash
   ample deploy . --name <app_name> --public --start "python3 run.py" --release-command "python3 migrate.py"
   ```
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.  
   ```bash
   ample logs <app_name> --kind build
   ```

## Example
**Flask release-command canary**  
`python3 migrate.py` runs before activation against the auto-provisioned managed database.

## Success Checks
- 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.
- Apps auto-pause when idle and wake on the next request; always-on is an operator setting, not a plan feature.
- 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
- **Monthly Amount**: $10.00 (USD)
  - **App Server**  
    - Size: s-1vcpu-1gb  
    - Monthly Amount: $5.00
  - **Managed PostgreSQL Database**  
    - Size: s-1vcpu-1gb  
    - Monthly Amount: $5.00

## Next Actions
- **Browse the catalog index**  
  - Method: GET  
  - Relative Path: /v1/catalog
- **Search published recipes by intent, stack and constraints**  
  - Method: POST  
  - Relative Path: /v1/catalog/search
- **Prepare a side-effect-free deployment plan for an authorized project**  
  - Method: POST  
  - Relative Path: /v1/catalog/plan
