1001Ferramentas
🧬 Geradores

Gerador de TypeORM entity a partir de tabela

Gera uma classe TypeORM (TypeScript) com @Entity, @PrimaryGeneratedColumn e colunas básicas — a partir do nome da tabela.

Entities TypeORM: decorators, relações e migrations

TypeORM é um ORM para TypeScript / JavaScript criado por Umed Khudoiberdiev em 2016, amplamente adotado por NestJS, Adonis e muitos back-ends Node corporativos. Sua marca registrada é a definição de entities baseada em decorators: classes anotadas com @Entity, @Column e decorators de relação servem ao mesmo tempo como modelos de runtime, fonte de migrations e definições de tipo. Como a mesma classe dirige o schema do banco e o código da aplicação, o sistema de tipos pega tipos de divergência que costumam atormentar projetos com SQL escrito à mão e classes de modelo separadas.

Este gerador monta uma entity básica para uma única tabela; a referência abaixo cobre o catálogo completo de decorators, o trade-off Active Record vs Data Mapper, o query builder, migrations, soft delete e como o TypeORM se compara ao Prisma, Sequelize e às alternativas mais recentes ganhando força.

Decorators e exemplo completo

import {
  Entity, PrimaryGeneratedColumn, Column,
  OneToMany, ManyToOne, CreateDateColumn,
  UpdateDateColumn, DeleteDateColumn, Index,
} from 'typeorm';

@Entity()
@Index(['email'], { unique: true })
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ length: 100 })
  name: string;

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

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

  @CreateDateColumn() createdAt: Date;
  @UpdateDateColumn() updatedAt: Date;
  @DeleteDateColumn() deletedAt: Date | null;
}

Os principais decorators: @Entity, @Column, @PrimaryGeneratedColumn('uuid' | 'increment' | 'rowid'), @OneToOne, @OneToMany, @ManyToOne, @ManyToMany + @JoinTable, @Index, @Unique, @Check, @CreateDateColumn, @UpdateDateColumn, @DeleteDateColumn (soft delete) e @VersionColumn para optimistic locking.

Active Record vs Data Mapper, repositories e query builder

TypeORM é um dos poucos ORMs que suporta os dois padrões. Active Record anexa métodos de persistência à entity (user.save(), User.findOne()) — conciso, mas acopla modelos ao banco. Data Mapper separa entities de repositories (userRepo.save(user)) — mais boilerplate, mais fácil de testar, é o default do NestJS. O QueryBuilder oferece uma alternativa typesafe ao SQL bruto para consultas complexas:

const result = await userRepo
  .createQueryBuilder('user')
  .leftJoinAndSelect('user.posts', 'post')
  .where('user.createdAt > :desde', { desde })
  .orderBy('user.createdAt', 'DESC')
  .take(50)
  .getMany();

Migrations e soft delete

O comando typeorm migration:generate compara suas entities com o schema atual do banco e emite uma migration TypeScript com métodos up() e down(); typeorm migration:run aplica as pendentes em ordem. Os metadados ficam em uma tabela migrations. Soft delete usa o @DeleteDateColumn: chamar repo.softDelete(id) preenche a coluna com o timestamp atual, e os find() subsequentes excluem as linhas soft-deletadas automaticamente. Para recuperar uma linha, chame repo.restore(id); para incluir as removidas, use withDeleted: true.

Suporte a bancos e ecossistema

  • Drivers suportados: PostgreSQL, MySQL, MariaDB, SQLite, Oracle, MS SQL Server, CockroachDB e suporte parcial a MongoDB.
  • NestJS distribui @nestjs/typeorm com injeção de repositories no nível de módulo — era o default tradicional antes do Prisma ganhar tração.
  • vs Prisma: Prisma é schema-first (um arquivo Prisma gera um cliente totalmente tipado). TypeORM é class-first. A DX e a inferência de TS do Prisma são mais afiadas; o TypeORM é mais flexível para schemas legados e consultas ad-hoc.
  • vs Sequelize: o Sequelize é mais antigo que o TypeScript e os tipos foram acoplados depois; o TypeORM é nativo de TS. O Sequelize tem mais quilometragem em workloads de alto throughput.
  • Alternativas em alta: MikroORM (abordagem por decorators similar, mais Unit of Work e Identity Map), Drizzle (SQL builder enxuto com inferência TS) e Kysely (query builder tipado sem camada de ORM).

FAQ

Prisma substituiu o TypeORM? Não — eles coexistem. Projetos greenfield muitas vezes escolhem Prisma pela DX; bases TypeORM existentes seguem produtivas, sobretudo com joins complexos ou schemas legados. Em 2026, ambos são escolhas válidas.

Funciona bem com NestJS? Muito. O @nestjs/typeorm integra entities aos módulos e injeta repositories em services com um decorator. Vários tutoriais de NestJS ainda usam TypeORM por padrão.

Como faço soft delete? Adicione um @DeleteDateColumn à entity e chame repo.softDelete() em vez de delete(). Para listar registros removidos, defina withDeleted: true nas opções de busca.

Vale se preocupar com o momentum? A manutenção desacelerou em 2022–2023 quando o mantenedor original se afastou, mas o projeto segue ativo e amplamente em produção. Se você está começando do zero e quer o ecossistema mais ativo, olhe Prisma, Drizzle ou MikroORM; se já tem código TypeORM, não há urgência em migrar.

Ferramentas Relacionadas