Database
PostgreSQL with Prisma ORM for type-safe database operations and migrations.
Stack
- • PostgreSQL database
- • Prisma ORM with TypeScript
- • Automated migrations
- • Connection pooling
Features
- • User & subscription management
- • Auth tables (NextAuth.js)
- • Event tracking
- • Waitlist management
Schema
Core Models
prisma/schema.prisma
1model User {2 id String @id @default(cuid())3 name String?4 email String @unique5 emailVerified DateTime?6 image String?7 accounts Account[]8 subscription Subscription?9 createdAt DateTime @default(now())10 updatedAt DateTime @updatedAt11}1213model Subscription {14 id String @id @default(cuid())15 userId String @unique16 user User @relation(...)17 stripeCustomerId String?18 stripeSubscriptionId String? @unique19 stripePriceId String?20 stripeCurrentPeriodEnd DateTime?21 status String?22 cancelAtPeriodEnd Boolean @default(false)23 type SubscriptionType24 createdAt DateTime @default(now())25 updatedAt DateTime @updatedAt26}
Connection
src/server/db.ts
1import { PrismaClient } from "@prisma/client";23const globalForPrisma = globalThis as unknown as {4 prisma: PrismaClient | undefined;5};67export const db = globalForPrisma.prisma ?? new PrismaClient();89if (process.env.NODE_ENV !== "production") {10 globalForPrisma.prisma = db;11}
Singleton pattern prevents too many connections during development.
Common Queries
1import { db } from "~/server/db";23// Get user with subscription4const user = await db.user.findUnique({5 where: { id: userId },6 include: { subscription: true },7});89// Create with transaction10await db.$transaction(async (tx) => {11 const subscription = await tx.subscription.create({12 data: { userId, status: "active", ... },13 });1415 await tx.subscriptionEvent.create({16 data: { subscriptionId: subscription.id, eventType: "created" },17 });1819 return subscription;20});
Commands
Development
pnpm db:generate— Generate clientpnpm db:push— Push schema changespnpm db:studio— Open Prisma Studiopnpm db:reset— Reset database
Production
pnpm db:migrate dev— Create migrationpnpm db:migrate deploy— Apply migrations- Always backup before migrations
- Test in staging first
Use db:push for rapid prototyping. Create migrations with db:migrate dev before committing.
Next: GitHub Actions
Automated database migrations