AEAl-Andalus⺢Experience
Sign in · Join
AEAl-Andalus⺢Experience
ProjectsGalleryAboutArticlesDashboardAPI
© 2026 — Modular content systems☕buy me a coffee
Framework Study Guide
ChaptersCardsLegendRoadmapRoute Map
Chapters
00 · Root Layout01 · Server Page (page.tsx)01a · Special Files (not-found, error, loading)02 · Client Component (UI & Interaction)02a · Client Boundaries & Islands03 · Entity Actions (actions/*.ts)04 · Server Actions ("use server")05 · Context Provider (context/*.tsx)06 · API Route (app/(api)/<entity>/route.ts)07 · TypeScript + Prisma08 · Entity-First Feature Design09 · Deployment, Docker & Cloud10 · Next 16 + Prisma 7 Upgrade11 · Prisma 7 (SQLite-first, App Router)12 · TypeORM (Entities + Migrations)13 · Drizzle ORM (SQL-first)11 · CSS, Mobile-First Flex, Tailwind12 · Libraries, Accelerators & Production Shortcuts14 · Next.js 16: cache, PPR, proxy, AI
→ cards/12-typeorm

Chapter

12 · TypeORM (Entities + Migrations)

TypeORM quickstart for Next: entities, data source, usage, and migration guidance.

Mental Model

  • Explicit entities + repositories; migrations-first in prod.
  • Great for long-lived schemas and SQL-heavy workflows.

Install

npm install typeorm reflect-metadata sqlite3

Data Source (SQLite dev)

import "reflect-metadata";
import { DataSource } from "typeorm";
import { User } from "@/entities/User";
import { Post } from "@/entities/Post";

export const AppDataSource = new DataSource({
  type: "sqlite",
  database: "dev.db",
  synchronize: true, // dev only
  entities: [User, Post],
});

Entities

// entities/User.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { Post } from "./Post";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ unique: true })
  email: string;

  @OneToMany(() => Post, (post) => post.author)
  posts: Post[];
}

Usage

await AppDataSource.initialize();
const repo = AppDataSource.getRepository(User);
await repo.find({ relations: ["posts"] });

SQLite → Postgres

  • Set type: "postgres", url: process.env.DATABASE_URL.
  • Use migrations (typeorm migration:generate/run) instead of synchronize in prod.