Postgres migrations

TIP

Requires @compas/cli and @compas/store to be installed

Migration files

Compas cli comes with a migration runner built-in. This is based on various migration functions exported from @compas/store. The migration system supports two types of migrations:

  • Forward migrations
  • Repeatable migrations

Forward migrations are a way of only advancing the schema state. So when you need to rollback a change, a new forward migration needs to be created.

Repeatable migrations can be used in combination with CREATE OR REPLACE with for example views. If the hash of the current repeatable migration is not equal to the last execution stored in the database, the migration is executed.

Every migration file gets a new transaction by default. To skip transaction creation, add -- disable auto transaction in your file.

The migrations files are expected to live in $project/migrations directory. The file names should be in the following format: 001-name.sql or 002-r-long-name.sql for repeatable migrations.

We also support JavaScript based migrations, this allows you to do conditional logic based on environment settings. A JavaScript migration file follows the same file format as sql files: 002-my-js-migration.js. To disable automatic transactions you can use // disable auto transaction anywhere in the file.

The file is imported by the migration runner and expected to export the following migration function:

export async function migrate(sql) {
  // Do migrations
}

Note that it is suggested to keep the amount of differences per environment to a minimal, since it makes issues harder to debug.

See the CLI reference for compas migrate for the build-in migration runner.