Create Database Migration
Read the canonical human guidance in
docs/practices/database-migrations.md
before making a migration. This skill is the executable checklist that
accompanies it.
Instructions
- Create a new, empty migration file:
cd ghost/core && pnpm migrate:create <kebab-case-slug>. IMPORTANT: do not create the migration file manually; always use this script to create the initial empty migration file. The slug must be kebab-case (e.g.add-column-to-posts). - The above command will create a new directory in
ghost/core/core/server/data/migrations/versionsif needed, create the empty migration file with the appropriate name, and bump the core and admin package versions to RC if this is the first migration after a release. - Update the migration file with the changes you want to make in the database, following the existing patterns in the codebase. Where appropriate, prefer to use the utility functions in
ghost/core/core/server/data/migrations/utils/*. - Update the schema definition file in
ghost/core/core/server/data/schema/schema.js, and make sure it aligns with the latest changes from the migration. - Test the migration manually:
cd ghost/core && pnpm knex-migrator migrate --v {version directory} --force - Roll the migration back to test
down():cd ghost/core && pnpm knex-migrator rollback --v {previous version} --force, then migrate forward again. - Run the migration integration test, which covers initialization, rollback, forward migration, and idempotency:
cd ghost/core && pnpm test:single test/integration/migrations/migration.test.js. Migrations must pass the database-backed suites against both MySQL and SQLite. - If adding or dropping a table, update
ghost/core/core/server/data/exporter/table-lists.jsas appropriate. The consistency assertion inghost/core/test/unit/server/data/exporter/index.test.jschecks that every schema table is classified in the exporter lists. - Run the focused exporter unit test when the table lists change:
cd ghost/core && pnpm test:single test/unit/server/data/exporter/index.test.js. - Run the schema integrity test, and update the hash:
cd ghost/core && pnpm test:single test/unit/server/data/schema/integrity.test.js - Run unit tests in Ghost core, and iterate until they pass:
cd ghost/core && pnpm test:unit
Examples
See examples.md for example migrations.
Rules
See rules.md for rules that should always be followed when creating database migrations.