SQL DDL to TypeORM Entity Generator (TypeScript Entities)
Convert SQL CREATE TABLE DDL statements into TypeScript TypeORM entity classes with @Column, @PrimaryGeneratedColumn, and relations.
/**
* 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;
}
100% Client-Side Privacy
Zero database connections or server uploads. All SQL parsing, AST extraction, and TypeScript TypeORM entity synthesis occur entirely within your local browser.
Intelligent TypeORM Decorators
Automatically maps primary keys (@PrimaryGeneratedColumn, @PrimaryColumn), column types, precision, default values, @CreateDateColumn, @UpdateDateColumn, @Index, and @Unique.
Multi-Dialect & Bidirectional Relations
Seamlessly converts PostgreSQL, MySQL, SQLite, and SQL Server schemas into typed @ManyToOne, @OneToMany, and @OneToOne relations with cascade options.