NoteThis document has been updated to include the recommended Prisma and PlanetScale workflow, specifically the
recommendation to use
prisma db push instead of prisma migrate dev with shadow branches. Also, you previously
needed to turn on the ability to automatically copy the Prisma migration metadata. You no longer need to do this. Read
more below.Introduction
In this tutorial, we’re going to learn how to do Prisma migrations in PlanetScale as part of your deployment process usingprisma db push.
Quick introduction to Prisma’s db push
From a high level, Prisma’sdb push introspects your PlanetScale database to infer and execute the changes required to make your database schema reflect the state of your Prisma schema. When prisma db push is run, it will ensure the schema in the PlanetScale branch you are currently connected to matches your current Prisma schema.
We recommend prisma db push over prisma migrate dev for the following reasons:
PlanetScale provides Online Schema Changes that are deployed automatically when you merge a deploy request and prevents blocking schema changes that can lead to downtime. This is different from the typical Prisma workflow which uses prisma migrate in order to generate SQL migrations for you based on changes in your Prisma schema. When using PlanetScale with Prisma, the responsibility of applying the changes is on the PlanetScale side. Therefore, there is little value to using prisma migrate with PlanetScale.
Also, the migrations table created when prisma migrate runs can also be misleading since PlanetScale does the actual migration when the deploy request is merged, not when prisma migrate is run which only updates the schema in the development database branch. You can still see the history of your schema changes in PlanetScale.
Prerequisites
- Add Prisma to your project using
npm install prisma --save-devoryarn add prisma --dev(depending on what package manager you prefer). - Run
npx prisma initinside of your project to create the initial files needed for Prisma. - Install the PlanetScale CLI.
- Authenticate the CLI with the following command:
Execute your first Prisma db push
Prisma migrations follow the PlanetScale non-blocking schema change workflow. First, the schema is applied to a development branch and then the development branch is merged into themain production database.
Let’s begin with an example flow for running Prisma migrations in PlanetScale:
1
Create a new prisma-playground database:
2
Connect to the database branch:
NoteThis step assumes you created a new PlanetScale database and have not yet enabled Safe Migrations on the
main branch. You will need to create a new development branch otherwise.3
Update your
prisma/schema.prisma file with the following schema:NoteIn Prisma
4.5.0, referentialIntegrity changed to relationMode and became generally available in 4.7.0. The following schema reflects this change.You can learn more about Prisma’s Relation mode in the
Prisma docs.4
Update your
.env file:5
In another terminal, use the Unlike the After Or you can see it in the PlanetScale UI under the Schema tab in your
db push command to push the schema defined in prisma/schema.prisma:prisma migrate dev command, it will not create a migrations folder containing a SQL file with the SQL used to update the schema in your PlanetScale database. PlanetScale will be tracking your migrations in this workflow.TipYou can learn more about the
prisma db push command in the
Prisma docs.db push is successful, you can see the table created in your terminal. For example, to see the Post table:TipUse the
exit command to exit the MySQL shell.main branch.6
Finally, turn on safe migrations on the
main branch to enable non-blocking schema changes:Execute succeeding Prisma migrations in PlanetScale
Our first example migration flow went well, but what happens when you need to run further changes to your schema? Let’s take a look:1
Create a new development branch from
main called add-subtitle-to-posts:2
Close the proxy connection to your
main branch (if still open) and connect to the new add-subtitle-to-posts development branch:3
In the
prisma/schema.prisma file, update the Post model:Add a new subtitle field to Post:4
Run
db push again to update the schema in PlanetScale:5
Open a deploy request for your
add-subtitle-to-posts branch, so that you can deploy these changes to main.You can complete the deploy request either in the web app or with the pscale deploy-request command.6
Once the deploy request is merged, you can see the results in your main branch’s
Post table:
