TypeORM is a feature-rich ORM for TypeScript and JavaScript that supports PostgreSQL, MySQL, SQLite, MongoDB, and more. It uses decorators for entity definitions and provides both Active Record and Data Mapper patterns.
Installation
npm install typeorm reflect-metadata pg
# Add to tsconfig.json: "emitDecoratorMetadata": true, "experimentalDecorators": true
Entity Definition
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column({ unique: true })
email: string;
@Column()
name: string;
@CreateDateColumn()
createdAt: Date;
@OneToMany(() => Post, post => post.author)
posts: Post[];
}
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column("text")
content: string;
@ManyToOne(() => User, user => user.posts)
author: User;
}
Data Source Setup
import { DataSource } from "typeorm";
export const AppDataSource = new DataSource({
type: "postgres",
host: "localhost",
port: 5432,
username: "admin",
password: "password",
database: "mydb",
entities: [User, Post],
synchronize: true // dev only!
});
await AppDataSource.initialize();
CRUD Operations
const userRepo = AppDataSource.getRepository(User);
// Create
const user = userRepo.create({ email: "dev@example.com", name: "Dev" });
await userRepo.save(user);
// Find with relations
const users = await userRepo.find({
where: { name: Like("%Dev%") },
relations: ["posts"],
order: { createdAt: "DESC" },
take: 10
});
// Query Builder
const result = await userRepo
.createQueryBuilder("user")
.leftJoinAndSelect("user.posts", "post")
.where("user.email LIKE :email", { email: "%example%" })
.orderBy("post.id", "DESC")
.getMany();
Migrations
npx typeorm migration:generate -d src/data-source.ts src/migrations/AddUserTable
npx typeorm migration:run -d src/data-source.ts
npx typeorm migration:revert -d src/data-source.ts
Need to extract or automate web content at scale? Check out my web scraping tools on Apify — no coding required. Or email me at spinov001@gmail.com for custom solutions.
Top comments (0)