CoachnestCoachnest
Sign InGet Started
Back to course

Mastering CRUD: Build Full-Stack Database Applications

…
—
Contents
1

What Is CRUD and Why It Matters

Reading12mFree
2

CRUD, REST, and HTTP Verbs

Reading14mFree
3

The Data Lifecycle of a Record

Reading11m
4

Course Project Tour: TaskFlow

Video9m
5

Chapter 1 — Quiz

Quiz8m
6

Tables, Rows, Columns & Types

Reading14m
7

Primary Keys & IDs (Auto-increment vs UUID)

Reading13m
8

Relationships: One-to-Many & Many-to-Many

Reading16m
9

Normalization & Schema Design Principles

Reading14m
10

Modeling TaskFlow with Prisma

Reading13m
11

Chapter 2 — Quiz

Quiz8m
12

INSERT — Creating Rows

Reading13m
13

SELECT — Reading & Filtering

Reading16m
14

UPDATE — Changing Rows Safely

Reading12m
15

DELETE — Removing Rows

Reading11m
16

Live SQL: A Full CRUD Session

Video15m
17

Chapter 3 — Quiz

Quiz9m
18

REST API Design for CRUD Resources

Reading14m
19

HTTP Status Codes That Tell the Truth

Reading12m
20

Scaffolding the API (Express & Next.js)

Reading16m

Connecting an ORM (Prisma) to Your Routes

Reading13m
22

Chapter 4 — Quiz

Quiz8m
23

Building the Create Endpoint End-to-End

Reading15m
24

Reading a Single Resource

Reading11m
25

Listing Collections

Reading13m
26

Live Coding: Create & Read

Video16m
27

Chapter 5 — Quiz

Quiz8m
28

PUT vs PATCH: Full vs Partial Updates

Reading13m
29

Authorization: Who Can Change This Row?

Reading12m
30

Soft Delete, Hard Delete & Restore

Reading14m
31

Idempotency & Concurrency Control

Reading13m
32

Chapter 6 — Quiz

Quiz9m
33

Input Validation with Zod

Reading14m
34

Mass Assignment & Over-Posting

Reading11m
35

SQL Injection & Safe Queries

Reading13m
36

Consistent Error Handling

Reading12m
37

Chapter 7 — Quiz

Quiz9m
38

Offset vs Cursor Pagination

Reading15m
39

Filtering & Dynamic WHERE Clauses

Reading13m
40

Safe Sorting & Full-Text Search

Reading14m
41

Indexing for Fast Reads

Reading13m
42

Chapter 8 — Quiz

Quiz9m
43

Forms & Creating Records from the UI

Reading14m
44

Fetching & Displaying Data

Reading13m
45

Optimistic Updates & Deletes

Reading14m
46

Building the TaskFlow UI

Video17m
47

Chapter 9 — Quiz

Quiz8m
48

Transactions & Data Integrity

Reading15m
49

Testing Your CRUD Endpoints

Reading14m
50

Caching, N+1 & Performance

Reading13m
51

Deploying & Migrating Safely

Reading14m
52

Chapter 10 — Final Quiz

Quiz10m
←→navigate lessons
Chapter 4 of 10·Chapter 4 — Building a CRUD REST API
Lesson 21 of 52Reading13 min

Connecting an ORM (Prisma) to Your Routes

Connecting an ORM (Prisma) to Your Routes¶

An ORM turns SQL into type-safe function calls. Here's the full CRUD surface in Prisma.

A Singleton Client¶

Create one client and reuse it. In serverless/Next.js, guard against hot-reload duplicates:

ts
6 lines
1// lib/prisma.ts
2import { PrismaClient } from "@prisma/client";
3
4const globalForPrisma = globalThis as unknown as { prisma?: PrismaClient };
5export const prisma = globalForPrisma.prisma ?? new PrismaClient();
6if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;

The Four Operations¶

ts
25 lines
1// CREATE
2const task = await prisma.task.create({
3  data: { title: "Write docs", ownerId },
4});
5
6// READ many (with relation + filter + order + page)
7const tasks = await prisma.task.findMany({
8  where: { status: "TODO" },
9  include: { owner: true },
10  orderBy: { createdAt: "desc" },
11  take: 20,
12  skip: 0,
13});
14
15// READ one
16const one = await prisma.task.findUnique({ where: { id } });
17
18// UPDATE
19const updated = await prisma.task.update({
20  where: { id },
21  data: { status: "DONE" },
22});
23
24// DELETE
25await prisma.task.delete({ where: { id } });

Handling "Not Found" Cleanly¶

update and delete throw if the row doesn't exist. Catch the known error code and translate to 404:

ts
11 lines
1import { Prisma } from "@prisma/client";
2
3try {
4  await prisma.task.delete({ where: { id } });
5  return NextResponse.json(null, { status: 204 });
6} catch (e) {
7  if (e instanceof Prisma.PrismaClientKnownRequestError && e.code === "P2025") {
8    return NextResponse.json({ error: "Not found" }, { status: 404 });
9  }
10  throw e;
11}

Selecting Fields¶

Return only what the client needs and never leak internal columns:

ts
3 lines
1await prisma.user.findMany({
2  select: { id: true, name: true }, // no passwordHash!
3});

The ORM is the bridge between Chapter 3's SQL and a clean, typed API. Next we wire up Create and Read end to end.

Previous

Scaffolding the API (Express & Next.js)

Next

Chapter 4 — Quiz

Use ← → arrow keys to navigate between lessons