Switch to Prisma ORM

SQL ORMs

Learn how to migrate from Sequelize or TypeORM to Prisma ORM

Introduction

This guide shows you how to migrate your application from Sequelize or TypeORM to Prisma ORM.

You can learn how Prisma ORM compares to these ORMs on the comparison pages:

Prerequisites

Before starting this guide, make sure you have:

  • A Sequelize or TypeORM project you want to migrate
  • Node.js installed (version 18 or higher)
  • PostgreSQL, MySQL, or another supported database

Overview of the migration process

The steps for migrating from Sequelize or TypeORM to Prisma ORM are always the same:

  1. Install the Prisma CLI
  2. Introspect your database
  3. Create a baseline migration
  4. Install and generate Prisma Client
  5. Gradually replace your ORM queries with Prisma Client

Prisma ORM supports incremental adoption, so you can migrate your project step-by-step rather than all at once.

Step 1. Install the Prisma CLI

npm install prisma --save-dev
npm install @prisma/client

Step 2. Introspect your database

Run the following command to create a basic Prisma setup:

npx prisma init

This creates a prisma directory with a schema.prisma file and a .env file. Update the DATABASE_URL in .env with your connection string:

DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"

Then introspect your database to generate Prisma models:

npx prisma db pull

To create a baseline migration, run:

mkdir -p prisma/migrations/0_init
npx prisma migrate diff --from-empty --to-schema prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql
npx prisma migrate resolve --applied 0_init

Step 3. Install and generate Prisma Client

npx prisma generate

Create a file to instantiate Prisma Client (e.g., db/prisma.ts):

import { PrismaClient } from "@prisma/client";

export const prisma = new PrismaClient();

Step 4. Replace your ORM queries with Prisma Client

// Find records
const user = await User.findOne({ where: { id: 1 } });
const users = await User.findAll({
  where: { active: true },
  limit: 10,
  order: [['createdAt', 'DESC']]
});

// Create
const user = await User.create({
  name: 'Alice',
  email: 'alice@example.com'
});

// Update
await User.update(
  { name: 'Alicia' },
  { where: { id: 1 } }
);

// Delete
await User.destroy({ where: { id: 1 } });

// With relations
const posts = await Post.findAll({
  include: [{ model: User }],
  limit: 10
});

// Transaction
const result = await sequelize.transaction(async (t) => {
  const user = await User.create({ name: 'Alice' }, { transaction: t });
  const post = await Post.create({ title: 'Hello', userId: user.id }, { transaction: t });
  return { user, post };
});

Migration tips

  • Incremental adoption: Start by replacing read operations, then gradually move to write operations
  • Schema naming: Use @map and @@map to map Prisma model names to existing table/column names
  • Type safety: Run npx prisma generate after any schema changes
  • Performance: Use select to fetch only needed fields and avoid N+1 issues with include

Next steps

On this page