EasyStarter logoEasyStarter

Database

Database configuration and operations with Drizzle ORM

Overview

EasyStarter uses Cloudflare D1 (SQLite at the edge) with Drizzle ORM for type-safe database operations.

Schema Definition

Define your database schema in apps/server/src/db/schema/:

import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";

export const users = sqliteTable("users", {
  id: text("id").primaryKey(),
  email: text("email").notNull().unique(),
  name: text("name"),
  createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
});

Database Commands

CommandDescription
pnpm db:generateGenerate migration from schema changes
pnpm db:pushPush schema directly to D1 (dev only)
pnpm db:migrateRun migrations (production)
pnpm db:studioOpen Drizzle Studio (GUI)

Querying Data

Select

// Get all users
const allUsers = await db.select().from(users);

// With conditions
const activeUsers = await db.select().from(users).where(eq(users.status, "active"));

// With pagination
const paginatedUsers = await db.select().from(users).limit(10).offset(0);

Insert

await db.insert(users).values({
  id: crypto.randomUUID(),
  email: "user@example.com",
  name: "John Doe",
  createdAt: new Date(),
});

Update

await db.update(users).set({ name: "Jane Doe" }).where(eq(users.id, userId));

Delete

await db.delete(users).where(eq(users.id, userId));

Relations

Define relations between tables:

import { relations } from "drizzle-orm";

export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts),
}));

export const postsRelations = relations(posts, ({ one }) => ({
  author: one(users, {
    fields: [posts.authorId],
    references: [users.id],
  }),
}));

Production Setup

  1. Create a D1 database in Cloudflare Dashboard
  2. Update wrangler.jsonc with your database binding
  3. Run migrations: pnpm db:migrate

On this page