Skip to main content
General

Database

Learn how to manage your database, schema, and migrations with Prisma ORM.

Open MarkdownFull AI corpusFeedback

The Pro Next.js Prisma starter kit uses Prisma ORM with PostgreSQL. Prisma provides a powerful and intuitive way to manage your database schema and interact with your data.

Client Setup

The Prisma client is initialized in lib/db/prisma.ts and exported from lib/db/index.ts. It uses the pg driver for optimized connections.

lib/db/prisma.ts
import 'server-only';

import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '@prisma/client';
import { Pool } from 'pg';

function createPrismaClient() {
  const connectionString = process.env.DATABASE_URL;
  if (!connectionString) {
    throw new Error('DATABASE_URL is required to initialize PrismaClient');
  }

  const pool = new Pool({ connectionString });
  return new PrismaClient({
    adapter: new PrismaPg(pool)
  });
}

export const prisma = createPrismaClient();

The client is then exported from lib/db/index.ts:

lib/db/index.ts
export * from './prisma';

Schema Definition

Your database schema is defined in prisma/schema.prisma. This file contains your models, enums, and relations.

Example Model Definition

prisma/schema.prisma
model Lead {
    id             String       @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
    organizationId String       @map("organization_id") @db.Uuid
    firstName      String       @map("first_name") @db.Text
    lastName       String       @map("last_name") @db.Text
    email          String       @unique @db.Text
    createdAt      DateTime     @default(now()) @map("created_at") @db.Timestamptz(6)
    updatedAt      DateTime     @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)

    organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)

    @@index([organizationId], map: "lead_organization_id_idx")
    @@map("lead")
}

Migrations

Commands

CommandDescription
npm run db:generateGenerate Prisma Client from schema
npm run db:migrateApply pending migrations
npm run db:studioOpen Prisma Studio GUI
npm run db:pushPush schema directly (dev only, no migration)

Migration Workflow

  1. Edit schema in prisma/schema.prisma.
  2. Create migration: npm run db:migrate:dev -- --name your_migration_name.
  3. Review migration in prisma/migrations/.
  4. Deploy migration: npm run db:migrate (production) or npm run db:migrate:dev (development).

Multi-Tenancy

Critical: Always filter by organizationId for tenant data to ensure data isolation.

trpc/routers/lead-router.ts
const leads = await prisma.lead.findMany({
  where: { organizationId: ctx.organization.id }
});

Transactions

Use $transaction for related operations that must be atomic.

lib/actions/widget.ts
const result = await prisma.$transaction(async (tx) => {
  await tx.subscriptionItem.deleteMany({
    where: { subscriptionId: subId }
  });

  await tx.subscriptionItem.createMany({
    data: newItems
  });

  return tx.subscriptionItem.findMany({
    where: { subscriptionId: subId }
  });
});