Database

Type-safe database access with Drizzle ORM

Database

Eden Stack uses Drizzle ORM with Neon PostgreSQL for type-safe database operations.

Setup

The database client is configured in @eden/db:

import { db } from "@eden/db";

Required environment variable:

DATABASE_URL=postgresql://user:pass@host:5432/dbname

Schema Definition

Define your tables in packages/db/src/schema.ts:

import { pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";
 
export const users = pgTable("users", {
  id: uuid("id").primaryKey().defaultRandom(),
  email: text("email").notNull().unique(),
  name: text("name"),
  createdAt: timestamp("created_at").defaultNow().notNull(),
});
 
export const posts = pgTable("posts", {
  id: uuid("id").primaryKey().defaultRandom(),
  title: text("title").notNull(),
  content: text("content"),
  authorId: uuid("author_id").references(() => users.id),
  createdAt: timestamp("created_at").defaultNow().notNull(),
});

Basic Queries

Select

import { db, users } from "@eden/db";
import { eq } from "drizzle-orm";
 
// Get all users
const allUsers = await db.select().from(users);
 
// Get one user by ID
const user = await db.query.users.findFirst({
  where: eq(users.id, "user-id"),
});
 
// With conditions
const activeUsers = await db
  .select()
  .from(users)
  .where(eq(users.status, "active"));

Insert

const [newUser] = await db
  .insert(users)
  .values({
    email: "john@example.com",
    name: "John Doe",
  })
  .returning();

Update

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

Delete

await db.delete(users).where(eq(users.id, "user-id"));

Relations

Define relations for type-safe joins:

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

Query with relations:

const usersWithPosts = await db.query.users.findMany({
  with: {
    posts: true,
  },
});

Migrations

Development

Push schema changes directly (fast iteration):

bun run db:push

Production

Generate and run migrations:

# Generate migration from schema changes
bun run db:generate
 
# Run pending migrations
bun run db:migrate

Drizzle Studio

Visual database browser:

bun run db:studio

Next Steps

Full documentation for Eden Stack users

This documentation is exclusively available to Eden Stack customers. Already purchased? Log in to access the full content.