Module 6: Database Access

Using Prisma ORM with Server Components

Setting up Prisma

npm install prisma --save-dev
npm install @prisma/client
npx prisma init

Define your schema in prisma/schema.prisma:

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
}

Prisma Client Singleton

To prevent multiple instances of Prisma Client in development (due to hot reloading), use a singleton pattern.

// lib/prisma.js
import { PrismaClient } from '@prisma/client'

const prismaClientSingleton = () => {
  return new PrismaClient()
}

const globalForPrisma = globalThis

const prisma = globalForPrisma.prisma ?? prismaClientSingleton()

export default prisma

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma

Fetching Data

Fetch data directly in Server Components. No useEffect needed.

// app/page.js
import prisma from '@/lib/prisma'

export default async function Home() {
  const posts = await prisma.post.findMany({
    where: { published: true },
    orderBy: { id: 'desc' }
  })

  return (
    
    {posts.map(post => (
  • {post.title}
  • ))}
) }

Mutations

Combine Prisma with Server Actions to mutate data.

// app/actions.js
'use server'
import prisma from '@/lib/prisma'
import { revalidatePath } from 'next/cache'

export async function createPost(formData) {
  const title = formData.get('title')
  
  await prisma.post.create({
    data: { title }
  })
  
  revalidatePath('/')
}