OpenParable
Skip to content
← Back to skills

Database Migration

DevOps & Security
database-migration

Database Migration is an Agent Skill for devops & security published in the nixopus/nixopus repository on GitHub: a SKILL.md instruction file an AI agent can load to do this task.

Run database migrations safely during deployment — framework-specific commands, pre-deploy vs post-deploy timing, health gates, and rollback strategies. Use when the app has a database migration system and needs migrations run during deployment.

View on GitHub ↗
QUICK START

How to use this skill

Bring this guide into your coding agent with a prompt tailored to the tool you use.

  1. Open your project in Codex.
  2. Copy and paste the prompt below.
  3. Review files and risks before approving any action.
Prompt to paste
Inspect the Agent Skill at https://github.com/nixopus/nixopus/blob/HEAD/api/skills/database-migration/SKILL.md and all supporting files. Report provenance, permissions, scripts, dependencies, and security risks. Propose an exact installation into .agents/skills/database-migration, but wait for my approval before writing files or running scripts.

Copying this prompt does not install or run the skill. Review third-party files before use.

Database Migration

Detection

Check for migration tooling in the project:

SignalMigration toolEcosystem
prisma/schema.prisma or @prisma/client in depsPrismaNode.js
typeorm in deps + ormconfig or data-source.tsTypeORMNode.js
knex in deps + knexfileKnexNode.js
drizzle-orm in deps + drizzle.config.tsDrizzleNode.js
sequelize in deps + config/config.jsonSequelizeNode.js
manage.py + Django in depsDjangoPython
alembic/ directory or alembic in depsAlembicPython
flask-migrate in depsFlask-MigratePython
goose or migrate in go.modGoose / golang-migrateGo
ActiveRecord + db/migrate/Rails MigrationsRuby
ecto in mix.exsEctoElixir
flyway or liquibase in pom.xml / build.gradleFlyway / LiquibaseJava
Entity Framework in .csprojEF Core.NET

Migration Commands

ToolMigrate commandStatus/check command
Prismanpx prisma migrate deploynpx prisma migrate status
TypeORMnpx typeorm migration:runnpx typeorm migration:show
Knexnpx knex migrate:latestnpx knex migrate:status
Drizzlenpx drizzle-kit migratenpx drizzle-kit check
Sequelizenpx sequelize-cli db:migratenpx sequelize-cli db:migrate:status
Djangopython manage.py migratepython manage.py showmigrations
Alembicalembic upgrade headalembic current
Flask-Migrateflask db upgradeflask db current
Goosegoose upgoose status
golang-migratemigrate -path ./migrations -database $DATABASE_URL upmigrate ... version
Railsbundle exec rake db:migratebundle exec rake db:migrate:status
Ectomix ecto.migratemix ecto.migrations
Flywayflyway migrateflyway info
Liquibaseliquibase updateliquibase status
EF Coredotnet ef database updatedotnet ef migrations list

When to Run Migrations

Pre-deploy (before new code runs)

Use when: new code REQUIRES the schema change to function.

  • Run migration as a separate step before deploying the new container
  • If migration fails, abort deployment — don't start the new container
  • Compose: use a migrate service with depends_on before the app service

Post-deploy (as part of container startup)

Use when: migration is additive (new columns/tables) and old code wouldn't break.

  • Include migration command in Dockerfile CMD or entrypoint script
  • Risk: if migration fails, the container may crash-loop
  • Advantage: simpler deployment pipeline

Recommended patterns by framework

FrameworkPatternImplementation
PrismaEntrypoint scriptnpx prisma migrate deploy && node dist/index.js
DjangoEntrypoint scriptpython manage.py migrate && gunicorn ...
RailsEntrypoint scriptbundle exec rake db:migrate && bundle exec puma ...
AlembicPre-deploy stepRun alembic upgrade head before deploying
EctoRelease commandmix ecto.migrate as release pre-start hook
EF CorePre-deploy stepdotnet ef database update before deploying

Compose Migration Service

For compose deployments, add a migration service that runs before the app:

services:
  migrate:
    build: .
    command: npx prisma migrate deploy
    environment:
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/app
    depends_on:
      db:
        condition: service_healthy

  app:
    build: .
    depends_on:
      migrate:
        condition: service_completed_successfully
      db:
        condition: service_healthy

Entrypoint Script Pattern

When migrations run at container startup:

#!/bin/sh
set -e

echo "Running migrations..."
npx prisma migrate deploy

echo "Starting application..."
exec node dist/index.js

Key: use exec for the final command so the app process becomes PID 1 and receives signals correctly.

Safe Migration Practices

  • Always use migrate deploy / migrate:latest (not push or sync) — deploy applies migration files in order; push/sync can be destructive
  • Never run migrations interactively — all migration commands must work non-interactively in Docker
  • DATABASE_URL must be set — migrations need the production database connection, not a build-time placeholder
  • Additive-first: add new columns as nullable or with defaults before deploying code that requires them
  • Separate schema changes from data changes — schema migrations in deploy pipeline, data backfills as separate tasks
  • Test migrations against a copy before running on production when possible

Gotchas

  • Prisma migrate deploy vs db push: deploy applies migration files; push syncs schema directly (destructive, dev-only)
  • Django migrate with --run-syncdb can create tables without migration files — avoid in production
  • TypeORM synchronize: true in production drops and recreates tables — ensure it's disabled
  • Alembic autogenerate may miss some changes (custom types, triggers) — always review generated migrations
  • Rails db:schema:load vs db:migrate: schema:load replaces all migrations with a single schema load — only use for new databases
  • EF Core Update-Database in Package Manager Console is interactive — use dotnet ef database update for Docker

Related Skills

  • pre-deploy-checklist — Detects migration tools and checks if migration command is in the deploy flow
  • rollback-strategy — Guidance on rolling back when migrations make rollback risky
  • compose-setup — Migration service pattern for compose deployments