DEV Community

Alex Spinov
Alex Spinov

Posted on

TypeORM Has a Free API — Here's How to Build Type-Safe Database Queries

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
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)