Demo
General

Database

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

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 }
  });
});