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.
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
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)
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:
prisma.config.ts
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:
Or introspect an existing database:
4. Query with Prisma Client
Generate and use the type-safe client:
import { 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" },
},
},
});
- Prisma schema - Learn the schema language
- Prisma Client - Explore the query API