SQL a TypeORM

Generador de Entidades TypeORM desde SQL DDL (TypeScript)

Convierta sentencias DDL SQL CREATE TABLE en clases de entidad TypeScript TypeORM limpias con decoradores @Column, @PrimaryGeneratedColumn, relaciones e índices.

Preajustes:
Dialecto SQL:Nomenclatura:Estilo de propiedad:
Entrada SQL DDL(5 tables)
/**
 * TypeORM Entity Definitions (Generated by ToolsAA)
 * Target Dialect: POSTGRES
 * Date: 2026-10-21
 */

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

OrderStatusEnum {
  PENDING = 'PENDING',
  PAID = 'PAID',
  PROCESSING = 'PROCESSING',
  SHIPPED = 'SHIPPED',
  DELIVERED = 'DELIVERED',
  CANCELLED = 'CANCELLED',
}

UserRoleEnum {
  ADMIN = 'ADMIN',
  CUSTOMER = 'CUSTOMER',
  VENDOR = 'VENDOR',
}

@Entity('users')
User {
  @PrimaryGeneratedColumn('uuid', { name: 'id' })
  id!: string;

  @Column({ type: 'varchar', length: 255, name: 'email', unique: true })
  email!: string;

  @Column({ type: 'varchar', length: 150, name: 'full_name', nullable: true })
  fullName: string | null;

  @Column({ type: 'enum', enum: UserRoleEnum, default: UserRoleEnum.CUSTOMER, name: 'role' })
  role!: UserRoleEnum;

  @Column({ type: 'boolean', name: 'is_verified', default: false })
  isVerified!: boolean;

  @Column({ type: 'jsonb', name: 'metadata', nullable: true })
  metadata: Record<string, any> | null;

  @CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
  createdAt!: Date;

  @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
  updatedAt!: Date;

  @OneToOne(() => UserProfile, (userProfile) => userProfile.user)
  userProfile?: UserProfile | null;

  @OneToMany(() => Order, (order) => order.customer)
  orders!: Order[];
}

@Entity('user_profiles')
UserProfile {
  @PrimaryGeneratedColumn('uuid', { name: 'id' })
  id!: string;

  @Column({ type: 'uuid', name: 'user_id', unique: true })
  userId!: string;

  @Column({ type: 'varchar', length: 500, name: 'avatar_url', nullable: true })
  avatarUrl: string | null;

  @Column({ type: 'varchar', length: 32, name: 'phone_number', nullable: true })
  phoneNumber: string | null;

  @Column({ type: 'text', name: 'shipping_address', nullable: true })
  shippingAddress: string | null;

  @Column({ type: 'varchar', length: 64, name: 'tax_identifier', nullable: true })
  taxIdentifier: string | null;

  @OneToOne(() => User, (user) => user.userProfile, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'user_id' })
  user!: User;
}

@Entity('products')
@Index('idx_products_sku', ['sku'])
Product {
  @PrimaryGeneratedColumn({ name: 'id' })
  id!: number;

  @Column({ type: 'varchar', length: 64, name: 'sku', unique: true })
  sku!: string;

  @Column({ type: 'varchar', length: 200, name: 'title' })
  title!: string;

  @Column({ type: 'text', name: 'description', nullable: true })
  description: string | null;

  @Column({ type: 'decimal', precision: 12, scale: 2, name: 'unit_price', default: 0.00 })
  unitPrice!: string;

  @Column({ type: 'int', name: 'inventory_count', default: 0 })
  inventoryCount!: number;

  @Column({ type: 'boolean', name: 'is_active', default: true })
  isActive!: boolean;

  @CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
  createdAt!: Date;

  @OneToMany(() => OrderItem, (orderItem) => orderItem.product)
  orderItems!: OrderItem[];
}

@Entity('orders')
@Index('idx_orders_status', ['status'])
Order {
  @PrimaryGeneratedColumn('uuid', { name: 'id' })
  id!: string;

  @Column({ type: 'uuid', name: 'customer_id' })
  customerId!: string;

  @Column({ type: 'varchar', length: 64, name: 'order_number', unique: true })
  orderNumber!: string;

  @Column({ type: 'enum', enum: OrderStatusEnum, default: OrderStatusEnum.PENDING, name: 'status' })
  status!: OrderStatusEnum;

  @Column({ type: 'decimal', precision: 12, scale: 2, name: 'total_amount', default: 0.00 })
  totalAmount!: string;

  @Column({ type: 'decimal', precision: 10, scale: 2, name: 'tax_amount', default: 0.00 })
  taxAmount!: string;

  @Column({ type: 'text', name: 'shipping_notes', nullable: true })
  shippingNotes: string | null;

  @CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
  createdAt!: Date;

  @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
  updatedAt!: Date;

  @ManyToOne(() => User, (user) => user.orders, { onDelete: 'RESTRICT' })
  @JoinColumn({ name: 'customer_id' })
  customer!: User;

  @OneToMany(() => OrderItem, (orderItem) => orderItem.order)
  orderItems!: OrderItem[];
}

@Entity('order_items')
@Unique('uq_order_product', ['orderId', 'productId'])
OrderItem {
  @PrimaryGeneratedColumn({ name: 'id' })
  id!: number;

  @Column({ type: 'uuid', name: 'order_id' })
  orderId!: string;

  @Column({ type: 'int', name: 'product_id' })
  productId!: number;

  @Column({ type: 'int', name: 'quantity', default: 1 })
  quantity!: number;

  @Column({ type: 'decimal', precision: 12, scale: 2, name: 'unit_price' })
  unitPrice!: string;

  @Column({ type: 'decimal', precision: 12, scale: 2, name: 'subtotal' })
  subtotal!: string;

  @ManyToOne(() => Order, (order) => order.orderItems, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'order_id' })
  order!: Order;

  @ManyToOne(() => Product, (product) => product.orderItems, { onDelete: 'RESTRICT' })
  @JoinColumn({ name: 'product_id' })
  product!: Product;
}

Entidades Generadas5 entidades generadas
Relaciones Resueltas4 claves foráneas mapeadas
Columnas Mapeadas37 columnas convertidas

Privacidad 100% en el Cliente

Sin subidas a servidores ni conexiones de base de datos. El análisis sintáctico SQL y la generación TypeScript se procesan estrictamente en tu navegador.

Decoradores TypeORM Inteligentes

Mapea automáticamente claves primarias (@PrimaryGeneratedColumn, @PrimaryColumn), tipos de datos, @CreateDateColumn, @UpdateDateColumn, @Index y @Unique.

Multi-Dialecto y Relaciones Bidireccionales

Soporte completo para PostgreSQL, MySQL, SQLite y SQL Server con relaciones @ManyToOne, @OneToMany y @OneToOne con opciones CASCADE.

Referencia técnica y guía de arquitectura

Guía para desarrolladores: Generador de entidades TypeORM a partir de SQL DDL (Entidades TypeScript) — Guía de referencia

Convierta sentencias DDL SQL CREATE TABLE en clases de entidad TypeScript TypeORM limpias con decoradores @Column, @PrimaryGeneratedColumn, relaciones e índices.

Parámetros clave y controles

Dialecto SQLEnum (PostgreSQL | MySQL | SQLite | SQL Server | Oracle)

Especifica la sintaxis de la base de datos SQL utilizada para analizar tipos de datos de columnas, límites de caracteres, restricciones por defecto y claves primarias autoincrementales.

Por defecto: PostgreSQL
Estrategia de nombres de propiedadesEnum (camelCase con @Column({ name }) | Conservar snake_case SQL)

Determina si las columnas de base de datos en snake_case se transforman en propiedades idiomáticas camelCase de TypeScript con mapeos explícitos @Column({ name: 'nombre_columna' }).

Por defecto: camelCase con @Column({ name })
Estrategia de generación de relacionesEnum (Bidireccional (@ManyToOne y @OneToMany) | Solo claves foráneas escalares)

Configura si las restricciones de clave foránea SQL producen decoradores de relación completos de TypeORM con @JoinColumn o conservan campos escalares de clave foránea sin propiedades de objeto.

Por defecto: Bidireccional (@ManyToOne y @OneToMany)
Decoradores de marca de tiempoEnum (Automático @CreateDateColumn y @UpdateDateColumn | Estándar @Column)

Detecta columnas canónicas de auditoría (como created_at y updated_at) y les aplica las anotaciones especializadas de ciclo de vida automático de TypeORM.

Por defecto: Automático @CreateDateColumn y @UpdateDateColumn

Consejos profesionales y mejores prácticas

Utilice siempre la estrategia de

Utilice siempre la estrategia de nombres camelCase con mapeos explícitos @Column({ name: 'db_col_name' }). Esto mantiene su código TypeScript limpio e idiomático mientras garantiza que las tablas existentes permanezcan 100% compatibles sin migraciones destructivas.

Los tipos SQL como DECIMAL

Los tipos SQL como DECIMAL(18,4) y BIGINT superan la precisión numérica segura de number en JavaScript. TypeORM mapea DECIMAL a string de TypeScript por defecto; asegúrese de emplear bibliotecas como decimal.js o BigInt para operaciones financieras exactas.

Al definir relaciones @ManyToOne y

Al definir relaciones @ManyToOne y @OneToMany entre entidades separadas, declare siempre las referencias a la entidad destino como funciones flecha (p. ej., @ManyToOne(() => Author, (author) => author.posts)) para evitar errores de importación circular en Node.js.

Errores comunes y solución de problemas

Error de TypeORM: 'Missing @JoinColumn on entity relation'

En TypeORM, el decorador @JoinColumn() es obligatorio en el lado propietario de una relación @OneToOne y en el lado de clave foránea de una relación @ManyToOne. Asegúrese de colocar @JoinColumn({ name: 'author_id' }) junto a la propiedad que administra la clave foránea física.

Error del compilador TypeScript: 'Property has no initializer and is not definitely assigned in the constructor'

Cuando strictPropertyInitialization está habilitado en TypeScript, los campos de clase requieren inicialización. En entidades TypeORM, agregue el signo de exclamación de aserción definitiva (p. ej., 'title!: string;') para indicar al compilador que TypeORM gestiona la asignación.

Preguntas frecuentes (FAQ)

¿Cómo transforma el conversor los tipos de columnas SQL en tipos de TypeScript y decoradores TypeORM?▼

La asignación opera en dos niveles: el decorador declara el tipo físico de base de datos (p. ej., @Column({ type: 'varchar', length: 255 })) y la propiedad de clase recibe el tipo primitivo de TypeScript equivalente (string, number, boolean, Date u object para JSONB).

¿Cómo se traducen las claves primarias y secuencias autoincrementales?▼

Las columnas con PRIMARY KEY y cláusulas AUTO_INCREMENT, SERIAL o IDENTITY se convierten en @PrimaryGeneratedColumn('increment'). Las claves primarias UUID usan @PrimaryGeneratedColumn('uuid'), y las claves compuestas no autogeneradas emplean @PrimaryColumn().

¿Se pueden utilizar las entidades generadas directamente en proyectos NestJS?▼

Sí. El código generado produce clases TypeScript estándar decoradas con @Entity(), @Column() y decoradores de relación, totalmente compatibles con la configuración TypeOrmModule.forFeature([Entity]) de @nestjs/typeorm.

¿Se envían mis definiciones SQL DDL a algún servidor externo durante la conversión?▼

No. Todo el análisis sintáctico y la síntesis de entidades TypeScript se ejecuta 100% en el lado del cliente dentro de su navegador mediante analizadores locales en JavaScript. Sus esquemas de base de datos confidenciales nunca salen de su equipo.

Herramientas y utilidades relacionadas

Todas las herramientas →
Guía para Desarrolladores del Conversor de SQL CREATE TABLE DDL a Esquema ZodDesarrollo

Traduzca esquemas de tablas SQL, tipos de datos, restricciones y columnas anulables a esquemas de objetos Zod fuertemente tipados en TypeScript.

Abrir herramienta→
Conversor de Docker Compose a Manifiestos de Kubernetes (Compose a K8s)Desarrollo

Convierte servicios, variables de entorno, puertos y volúmenes de docker-compose.yml en YAML de Kubernetes Deployment y Service.

Abrir herramienta→
Guía de Desarrollo del Conversor de JSON a Variables de Entorno .env (Aplanar y Exportar)Desarrollo

Aplana cargas útiles JSON anidadas en configuraciones .env en mayúsculas SNAKE_CASE con delimitadores y prefijos personalizables.

Abrir herramienta→
Generador de Esquemas SQL DDL a Drizzle ORM (PostgreSQL, MySQL, SQLite) - Guía de DesarrolladorDesarrollo

Convierte sentencias SQL CREATE TABLE en esquemas fuertemente tipados de Drizzle ORM con definiciones pgTable, mysqlTable y sqliteTable.

Abrir herramienta→
Guía del Desarrollador: Generador de Esquemas Valibot desde JSON (Validación Modular TypeScript)Desarrollo

Transforme datos JSON en definiciones de esquemas Valibot ligeras y con soporte de tree-shaking mediante v.object, v.string, v.number y validadores de arrays.

Abrir herramienta→
Generador de esquemas JSON a TypeBox (Proveedor de tipos JSON Schema rápido)Desarrollo

Convierta estructuras JSON en definiciones TypeBox Type.Object de alto rendimiento para validación en tiempo de ejecución en Fastify, Ajv y TypeScript.

Abrir herramienta→