โณ
Prisma
Next-generation Node.js and TypeScript ORM
v5.8.0IntermediateORMTypeScriptDatabasePostgreSQLMySQL
Overview
Prisma is a next-generation ORM that consists of:
- **Prisma Client**: Auto-generated, type-safe query builder - **Prisma Migrate**: Declarative data modeling & migrations - **Prisma Studio**: GUI to view and edit data
Prisma supports PostgreSQL, MySQL, SQLite, SQL Server, MongoDB, and CockroachDB.
Schema Definition
prisma/schema.prisma
1// prisma/schema.prisma2generator client {3 provider = "prisma-client-js"4}5 6datasource db {7 provider = "postgresql"8 url = env("DATABASE_URL")9}10 11model User {12 id String @id @default(cuid())13 email String @unique14 name String?15 posts Post[]16 createdAt DateTime @default(now())17 updatedAt DateTime @updatedAt18}19 20model Post {21 id String @id @default(cuid())22 title String23 content String?24 published Boolean @default(false)25 author User @relation(fields: [authorId], references: [id])26 authorId String27 createdAt DateTime @default(now())28}Installation
Quick Install
Terminal
1-amber-400">npm install prisma @prisma/client && -amber-400">npx prisma initRequirements
- Node.js 18+
- Database (PostgreSQL, MySQL, SQLite, etc.)
Setup Steps
- 1Install Prisma: npm install prisma @prisma/client
- 2Initialize Prisma: npx prisma init
- 3Configure database URL in .env
- 4Define schema in prisma/schema.prisma
- 5Generate client: npx prisma generate
- 6Push schema: npx prisma db push
CRUD Operations
Prisma Client provides a fluent API for CRUD operations with full TypeScript support.
Database Queries
lib/db.ts
1400">import { PrismaClient } 400">from '@prisma/client';2 3400">const prisma = 400">new 300">PrismaClient();4 5// Create6400">const user = 400">await prisma.user.300">create({7 data: {8 email: 'john@example.com',9 name: 'John Doe',10 },11});12 13// Read14400">const users = 400">await prisma.user.300">findMany({15 where: { email: { contains: '@example.com' } },16 include: { posts: 400">true },17});18 19// Update20400">const updated = 400">await prisma.user.300">update({21 where: { id: user.id },22 data: { name: 'John Updated' },23});24 25// Delete26400">await prisma.user.300">delete({27 where: { id: user.id },28});Best Practices
- Use a singleton pattern for PrismaClient in development
- Define relations in your schema
- Use transactions for multiple operations
- Index frequently queried fields
- Use select/include to limit data fetched
Common Pitfalls
โ ๏ธCreating multiple PrismaClient instances
โ ๏ธNot closing connections properly
โ ๏ธN+1 query problems
โ ๏ธNot using migrations in production
Code Snippets
Prisma Singleton
basicProper Prisma client setup for Next.js
TypeScript
1// lib/prisma.ts2400">import { PrismaClient } 400">from '@prisma/client';3 4400">const globalForPrisma = globalThis 400">as unknown 400">as {5 prisma: PrismaClient | 400">undefined;6};7 8400">export 400">const prisma =9 globalForPrisma.prisma ??10 400">new 300">PrismaClient({11 log: ['query'],12 });13 14400">if (process.env.NODE_ENV !== 'production') {15 globalForPrisma.prisma = prisma;16}