โ–ณ

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.prisma
2generator 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 @unique
14 name String?
15 posts Post[]
16 createdAt DateTime @default(now())
17 updatedAt DateTime @updatedAt
18}
19 
20model Post {
21 id String @id @default(cuid())
22 title String
23 content String?
24 published Boolean @default(false)
25 author User @relation(fields: [authorId], references: [id])
26 authorId String
27 createdAt DateTime @default(now())
28}

Installation

Quick Install

Terminal
1-amber-400">npm install prisma @prisma/client && -amber-400">npx prisma init

Requirements

  • Node.js 18+
  • Database (PostgreSQL, MySQL, SQLite, etc.)

Setup Steps

  1. 1Install Prisma: npm install prisma @prisma/client
  2. 2Initialize Prisma: npx prisma init
  3. 3Configure database URL in .env
  4. 4Define schema in prisma/schema.prisma
  5. 5Generate client: npx prisma generate
  6. 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// Create
6400">const user = 400">await prisma.user.300">create({
7 data: {
8 email: 'john@example.com',
9 name: 'John Doe',
10 },
11});
12 
13// Read
14400">const users = 400">await prisma.user.300">findMany({
15 where: { email: { contains: '@example.com' } },
16 include: { posts: 400">true },
17});
18 
19// Update
20400">const updated = 400">await prisma.user.300">update({
21 where: { id: user.id },
22 data: { name: 'John Updated' },
23});
24 
25// Delete
26400">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

basic

Proper Prisma client setup for Next.js

TypeScript
1// lib/prisma.ts
2400">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}

Resources

Related Technologies