Launchframe

Adding a Database Table

1. Define the table

Add a new table to src/db/schema.ts:

import { pgTable, text, timestamp, boolean } from 'drizzle-orm/pg-core';
import { user } from './schema';

export const project = pgTable('project', {
  id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
  name: text('name').notNull(),
  description: text('description'),
  ownerId: text('owner_id').notNull().references(() => user.id),
  isPublic: boolean('is_public').notNull().default(false),
  createdAt: timestamp('created_at').notNull().defaultNow(),
  updatedAt: timestamp('updated_at').notNull().defaultNow(),
});

2. Push or migrate

For development:

pnpm db:push

For production (generates a migration file):

pnpm db:migrate

3. Query the table

import { db } from '@/lib/db';
import { project } from '@/db/schema';
import { eq } from 'drizzle-orm';

// Insert
await db.insert(project).values({
  name: 'My Project',
  ownerId: session.user.id,
});

// Select
const projects = await db
  .select()
  .from(project)
  .where(eq(project.ownerId, session.user.id));

4. Type safety

Drizzle generates TypeScript types from your schema:

import type { InferSelectModel, InferInsertModel } from 'drizzle-orm';

type Project = InferSelectModel<typeof project>;
type NewProject = InferInsertModel<typeof project>;