Skip to content

Repository files navigation

Prisma Migrations

Rollback and programmatic migrations for Prisma

npm codecov License: MIT

Adds up/down migrations, rollback, and programmatic API to Prisma. Compatible with Prisma 5, 6, and 7.

Feature Prisma Migrate This Tool
Run migrations forward Yes Yes
Rollback migrations No Yes
Run from Node.js code No Yes
Step-by-step control No Yes

Uses Prisma's _prisma_migrations table. Works alongside prisma migrate.

Installation

npm install prisma-migrations @prisma/client prisma

Quick Start

# Create a migration
npx prisma-migrations create add_users_table

# Run it
npx prisma-migrations up

# Roll back
npx prisma-migrations down

Forward migration (prisma/migrations/[timestamp]_add_users_table/migration.sql):

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  email VARCHAR(255) UNIQUE NOT NULL
);

Rollback (prisma/migrations/[timestamp]_add_users_table/down.sql):

DROP TABLE IF EXISTS users;

CLI

npx prisma-migrations up              # Run all pending
npx prisma-migrations up --steps 2    # Run next 2
npx prisma-migrations down            # Rollback last
npx prisma-migrations down --steps 3  # Rollback last 3
npx prisma-migrations status          # Check status
npx prisma-migrations reset --force   # Rollback all

Programmatic API

import { Migrations } from "prisma-migrations";
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();
const migrations = new Migrations(prisma);

await migrations.up(); // Run all pending
await migrations.down(); // Rollback last
await migrations.pending(); // Get pending list

await prisma.$disconnect();

Production Safety

  • Transactions: Prisma wraps each migration in a transaction. DDL rollback still depends on the database provider.
  • Lock Protection: Owner-scoped database leases prevent concurrent runs.
  • Checksum Validation: Detects if applied migrations have been modified

Prisma 7 CLI commands need a generated-client factory because each generated client has project-specific configuration:

// prisma-migrations.config.js
import { createDatabaseClient } from "./src/database.js";

export default {
  clientFactory: createDatabaseClient,
};

For concurrent deployments:

const result = await migrations.upIfNotLocked();
if (result.ran) {
  console.log(`Applied ${result.count} migrations`);
}

Documentation

Full documentation: jeffry.in/prisma-migrations

Development

bun install
bun run build
bun test

License

MIT

Releases

Packages

Used by

Contributors

Languages