apps/docs/content/docs.v6/orm/prisma-migrate/getting-started.mdx
This page explains how to get started with migrating your schema in a development environment using Prisma Migrate.
To get started with Prisma Migrate in a development environment:
Create a Prisma schema:
datasource db {
provider = "postgresql"
}
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])
}
datasource 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])
}
:::tip
You can use [native type mapping attributes](/v6/orm/prisma-migrate/workflows/native-database-types) in your schema to decide which exact database type to create (for example, `String` can map to `varchar(100)` or `text`).
:::
For Prisma 7, be sure to have a `prisma.config.ts` in the root of your project:
```ts title="prisma.config.ts" showLineNumbers
import 'dotenv/config'
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
},
datasource: {
url: env("DATABASE_URL"),
},
});
```
Create the first migration:
prisma migrate dev --name init
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL,
"name" TEXT NOT NULL,
PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Post" (
"id" SERIAL,
"title" TEXT NOT NULL,
"published" BOOLEAN NOT NULL DEFAULT true,
"authorId" INTEGER NOT NULL,
PRIMARY KEY ("id")
);
-- AddForeignKey
ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
Note: If you do not provide a
--name, Prisma CLI will prompt you for a name.
Your Prisma schema is now in sync with your database schema and you have initialized a migration history:
migrations/
└─ 20210313140442_init/
└─ migration.sql
Note: The folder name will be different for you. Folder naming is in the format of YYYYMMDDHHMMSS_your_text_from_name_flag.
Add additional fields to your schema:
model User {
id Int @id @default(autoincrement())
jobTitle String // [!code ++]
name String
posts Post[]
}
Create the second migration:
prisma migrate dev --name added_job_title
-- AlterTable
ALTER TABLE "User" ADD COLUMN "jobTitle" TEXT NOT NULL;
Your 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.
The steps involved in adding Prisma Migrate to your existing project are:
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.
prisma db pull
Baselining is the process of initializing a migration history for a database that:
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:
prisma/migrations folder, delete, move, rename, or archive this folder.migrations directory inside with your preferred name. This example will use 0_init for the migration name:
mkdir -p prisma/migrations/0_init
0_ is important because Prisma Migrate applies migrations in a lexicographic order. You can use a different value such as the current timestamp.
::::prisma migrate diff:
npx prisma migrate diff \
--from-empty \
--to-schema prisma/schema.prisma \
--script > prisma/migrations/0_init/migration.sql
To include unsupported database features that already exist in the database, you must replace or modify the initial migration SQL:
migration.sql file generated in the Create a baseline migration section.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) -- [!code ++]
WHERE success; -- [!code ++]
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 using pg_dump for this, you'll need to update the search_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.
:::info Note 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 facecan't create constraint` errors
:::
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 following to source control:
schema.prisma fileprisma migrate diff, prisma db execute and/ or prisma migrate resolve.