Getting started with Prisma Migrate
This page explains how to get started with migrating your schema in a development environment using Prisma Migrate. See Developing with Prisma Migrate for a more in-depth development workflow.
Get started with Prisma Migrate from scratch
To get started with Prisma Migrate in a development environment:
-
Create a Prisma schema:
schema.prismadatasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
published Boolean @default(true)
authorId Int
author User @relation(fields: [authorId], references: [id])
}tipYou can use native type mapping attributes in your schema to decide which exact database type to create (for example,
String
can map tovarchar(100)
ortext
).- Create the first migration:
prisma migrate dev --name init
Show CLI resultsYour Prisma schema is now in sync with your database schema and you have initialized a migration history:
migrations/
└─ 20210313140442_init/
└─ migration.sql -
Add additional fields to your schema:
model User {
id Int @id @default(autoincrement())
jobTitle String
name String
posts Post[]
} -
Create the second migration:
prisma migrate dev --name added_job_title
Show CLI resultsYour Prisma schema is once again in sync with your database schema, and your migration history contains two migrations:
migrations/
└─ 20210313140442_init/
└─ migration.sql
└─ 20210313140442_added_job_title/
└─ migration.sql
You now have a migration history that you can source control and use to deploy changes to test environments and production.
Adding Prisma Migrate to an existing project
The steps involved in adding Prisma Migrate to your existing project are:
- Introspect your database to update your Prisma schema
- Create a baseline migration
- Update your schema or migration to workaround features not supported by Prisma Schema Language
- Apply the baseline migration
- Commit the migration history and Prisma schema
Introspect to create or update your Prisma schema
Make sure your Prisma schema is in sync with your database schema. This should already be true if you are using a previous version of Prisma Migrate.
- Introspect the database to make sure that your Prisma schema is up-to-date:
prisma db pull
Create a baseline migration
Baselining is the process of initializing a migration history for a database that:
- Existed before you started using Prisma Migrate
- Contains data that must be maintained (like production), which means that the database cannot be reset
Baselining tells Prisma Migrate to assume that one or more migrations have already been applied. This prevents generated migrations from failing when they try to create tables and fields that already exist.
To create a baseline migration:
- If you have a
prisma/migrations
folder, delete, move, rename, or archive this folder. - Run the following command to create a
migrations
directory inside with your preferred name. This example will use0_init
for the migration name:mkdir -p prisma/migrations/0_init
noteThe
0_
is important because Prisma Migrate applies migrations in a lexicographic order. You can use a different value such as the current timestamp. - Generate a migration and save it to a file using
prisma migrate diff
:npx prisma migrate diff \
--from-empty \
--to-schema-datamodel prisma/schema.prisma \
--script > prisma/migrations/0_init/migration.sql - Review the generated migration.
Work around features not supported by Prisma Schema Language
To include unsupported database features that already exist in the database, you must replace or modify the initial migration SQL:
- Open the
migration.sql
file generated in the Create a baseline migration section. - Modify the generated SQL. For example:
- If the changes are minor, you can append additional custom SQL to the generated migration. The following example creates a partial index:
/* Generated migration SQL */
CREATE UNIQUE INDEX tests_success_constraint ON posts (subject, target)
WHERE success; - If the changes are significant, it can be easier to replace the entire migration file with the result of a database dump (
mysqldump
,pg_dump
). When usingpg_dump
for this, you'll need to updade thesearch_path
as follows with this command:SELECT pg_catalog.set_config('search_path', '', false);
; otherwise you'll run into the following error:The underlying table for model '_prisma_migrations' does not exist.
`infoNote that the order of the tables matters when creating all of them at once, since foreign keys are created at the same step. Therefore, either re-order them or move constraint creation to the last step after all tables are created, so you won't face
can't create constraint
errors
Apply the initial migrations
To apply your initial migration(s):
-
Run the following command against your database:
npx prisma migrate resolve --applied 0_init
-
Review the database schema to ensure the migration leads to the desired end-state (for example, by comparing the schema to the production database).
The new migration history and the database schema should now be in sync with your Prisma schema.
Commit the migration history and Prisma schema
Commit the following to source control:
- The entire migration history folder
- The
schema.prisma
file
Going further
- Refer to the Deploying database changes with Prisma Migrate guide for more on deploying migrations to production.
- Refer to the Production Troubleshooting guide to learn how to debug and resolve failed migrations in production using
prisma migrate diff
,prisma db execute
and/ orprisma migrate resolve
.