Prisma ORM
Prisma ORM is a next-generation Node.js and TypeScript ORM that provides type-safe database access, migrations, and a visual data editor.
Prisma ORM is open-source and consists of:
- Prisma Client: Auto-generated, type-safe ORM interface
- Prisma Migrate: Database migration system
- Prisma Studio: GUI to view and edit your data
Prisma Client works with any Node.js or TypeScript backend, whether you're deploying to traditional servers, serverless functions, or microservices.
Why Prisma ORM
Traditional database tools force a tradeoff between productivity and control. Raw SQL gives full control but is error-prone and lacks type safety. Traditional ORMs improve productivity but abstract too much, leading to the object-relational impedance mismatch and performance pitfalls like the n+1 problem.
Prisma takes a different approach:
- Type-safe queries validated at compile time with full autocompletion
- Thinking in objects without the complexity of mapping relational data
- Plain JavaScript objects returned from queries, not complex model instances
- Single source of truth in the Prisma schema for database and application models
- Healthy constraints that prevent common pitfalls and anti-patterns
When to use Prisma
Prisma is a good fit if you:
- Build server-side applications (REST, GraphQL, gRPC, serverless)
- Value type safety and developer experience
- Work in a team and want a clear, declarative schema
- Need migrations, querying, and data modeling in one toolkit
Consider alternatives if you:
- Need full control over every SQL query (use raw SQL drivers)
- Want a no-code backend (use a BaaS like Supabase or Firebase)
- Need an auto-generated CRUD GraphQL API (use Hasura or PostGraphile)
How it works
1. Define your schema
The Prisma schema defines your data models and database connection:
datasource db {
provider = "postgresql"
}
generator client {
provider = "prisma-client"
output = "./generated"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}2. Configure your connection
Create a prisma.config.ts file in your project root:
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"),
},
});3. Run migrations
Use Prisma Migrate to create and apply migrations:
npx prisma migrate devOr introspect an existing database:
npx prisma db pull4. Query with Prisma Client
Generate and use the type-safe client:
npm install @prisma/client
npx prisma generateimport { PrismaClient } from "./generated/client";
const prisma = new PrismaClient();
// Find all users with their posts
const users = await prisma.user.findMany({
include: { posts: true },
});
// Create a user with a post
const user = await prisma.user.create({
data: {
email: "alice@prisma.io",
posts: {
create: { title: "Hello World" },
},
},
});Next steps
- Prisma schema - Learn the schema language
- Prisma Client - Explore the query API