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:
- Install the Prisma CLI
- Introspect your database
- Create a baseline migration
- Install and generate Prisma Client
- 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/clientStep 2. Introspect your database
Run the following command to create a basic Prisma setup:
npx prisma initThis 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 pullTo 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_initStep 3. Install and generate Prisma Client
npx prisma generateCreate 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
@mapand@@mapto map Prisma model names to existing table/column names - Type safety: Run
npx prisma generateafter any schema changes - Performance: Use
selectto fetch only needed fields and avoid N+1 issues withinclude