Skip to main content

Overview

Drizzle provides a robust migration system that generates SQL migration files from your schema changes. Migrations ensure your database schema stays in sync with your code across environments.

Setup

Install Drizzle Kit

Drizzle Kit is the CLI companion for managing migrations:

Configuration File

Create a drizzle.config.ts file in your project root:

Generating Migrations

Generate Migration

After modifying your schema, generate a migration:
This creates SQL migration files in your configured output directory:

Migration Files

Generated SQL files contain the DDL statements:
drizzle/0001_add_users_table.sql

Running Migrations

Programmatic Migration

Run migrations from your application code:
migrate.ts
Run the migration script:

Migration Using Drizzle Kit

Alternatively, use Drizzle Kit directly:

Migration Configuration

Custom Migration Table

Configure the migrations tracking table:

Multiple Schema Directories

drizzle.config.ts

Migration Workflows

Development Workflow

1

Modify schema

Update your schema files with new tables, columns, or constraints:
schema.ts
2

Generate migration

Review the generated SQL to ensure it matches your intent.
3

Run migration

Or use Drizzle Kit:
4

Commit changes

Commit both schema changes and migration files:

Production Deployment

1

Test migrations

Run migrations in a staging environment first:
2

Backup database

Always backup your production database before running migrations:
3

Run migrations

Execute migrations during deployment:
4

Verify

Verify the migration succeeded:

Introspection

Pull from Database

Generate schema from an existing database:
This creates TypeScript schema files from your database structure.

Push to Database

Quickly push schema changes without generating migration files (development only):
drizzle-kit push is destructive and should only be used in development. Always use migrations in production.

Custom Migrations

Manual SQL

Create custom migration files for complex changes:
drizzle/0003_custom.sql

Breaking Point Notation

For queries that must run separately:

Migration Metadata

Journal File

The _journal.json tracks migration history:
drizzle/meta/_journal.json

Snapshot Files

Snapshot files store the schema state at each migration:
drizzle/meta/0001_snapshot.json

Common Patterns

Adding Columns

Generated migration:

Renaming Columns

Drizzle Kit detects renames by comparing snapshots:

Adding Indexes

Changing Column Types

Migration:

Best Practices

  • Version control: Always commit migration files with schema changes
  • Review migrations: Check generated SQL before running in production
  • Incremental changes: Make small, focused schema changes
  • Backup first: Always backup production before migrations
  • Test thoroughly: Run migrations in staging before production
  • Avoid push: Use migrations in production, not drizzle-kit push
  • Never edit generated migration files unless absolutely necessary
  • Don’t delete migration files that have run in production
  • Don’t modify the _journal.json or snapshot files manually

Troubleshooting

Migration Conflicts

If team members generate migrations simultaneously:
  1. Pull latest migrations from version control
  2. Regenerate your migration: npx drizzle-kit generate
  3. Resolve any conflicts in the schema files
  4. Commit both schema and new migrations

Failed Migrations

If a migration fails midway:
  1. Check the error message
  2. Fix the issue (schema or database state)
  3. Consider using transactions to ensure atomicity
  4. For PostgreSQL/SQLite, migrations run in transactions by default

Rollback

Drizzle doesn’t auto-generate rollback migrations. Create manual down migrations:
drizzle/0001_rollback.sql

Next Steps

Transactions

Learn about atomic database operations

Schema Declaration

Review schema definition patterns