migrate-database Command
Note: This command is implemented as part of the
@pinstripe/databasepackage and needs to be included in your project for it to be available.
Interface
The command applies pending database migrations with the following signature:
pinstripe migrate-database
Parameters
None - this command takes no parameters.
Examples
# Apply all pending migrations
pinstripe migrate-database
# Run programmatically in code
await this.runCommand('migrate-database');
Description
The migrate-database command is a database schema management tool that:
- Creates migration tracking table - Sets up
appliedMigrationstable if it doesn't exist - Scans migration files - Discovers all migration files in
lib/migrations/ - Applies pending migrations - Runs only migrations that haven't been applied yet
- Tracks applied migrations - Records each migration's schema version to prevent re-execution
- Maintains order - Executes migrations in chronological order based on timestamp
Migration Process
The command follows this sequence:
- Initialize tracking - Creates
appliedMigrationstable withschemaVersioncolumn - Load migrations - Imports all migration files from the project's
lib/migrations/directory - Sort by timestamp - Orders migrations by their Unix timestamp prefix
- Check status - Queries which migrations have already been applied
- Execute pending - Runs the
migrate()method for each unapplied migration - Record completion - Inserts the schema version into
appliedMigrationstable
Development vs Production
Development Environment
- Verbose logging - Shows "Applying migration: [name]" for each migration
- Automatic execution - Often run automatically during project initialization
Production Environment
- Silent execution - No console output during migration process
- Manual control - Typically run explicitly during deployment
Migration File Structure
Migrations are expected in this format:
// lib/migrations/1728471234_create_users_table.js
export default {
async migrate(){
await this.database.table('users', async users => {
await users.addColumn('name', 'string');
await users.addColumn('email', 'string');
await users.addColumn('created_at', 'datetime');
});
}
};
Safety Features
- Idempotent execution - Safe to run multiple times; skips already-applied migrations
- Sequential processing - Migrations run in strict chronological order
- Transaction safety - Each migration runs within its own context
- Error prevention - Stops on first migration failure to prevent partial application
Related Commands
generate-migration- Create new migration filesinitialize-database- Runs migrations and seeds (includes this command)seed-database- Populate database with initial datadrop-database- Remove database (requires re-migration)