Entwickler-Handbuch: SQL DDL zu TypeORM Entity Generator (TypeScript-Entities)

SQL DDL zu TypeORM Entity Generator (TypeScript Entities)

Konvertieren Sie SQL CREATE TABLE DDL-Anweisungen in saubere TypeScript TypeORM-Entitätsklassen mit @Column, @PrimaryGeneratedColumn, Relationen und Indizes.

Voreinstellungen:
Datenbank-Dialekt:Klassenbenennung:Eigenschaftsstil:
SQL DDL Eingabe(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;
}

TypeORM Entities5 Entitäten generiert
Relationen aufgelöst4 Fremdschlüssel zugeordnet
Spalten zugeordnet37 Spalten konvertiert

100% clientseitige Privatsphäre

Keine Server-Uploads oder Datenbankverbindungen. Das gesamte SQL-Parsing und die TypeORM-Code-Generierung laufen vollständig lokal in Ihrem Browser.

Intelligente TypeORM-Dekoratoren

Automatische Zuordnung von Primärschlüsseln (@PrimaryGeneratedColumn, @PrimaryColumn), Spaltentypen, @CreateDateColumn, @UpdateDateColumn, @Index und @Unique.

Multi-Dialekt & bidirektionale Relationen

Unterstützt PostgreSQL, MySQL, SQLite und SQL Server mit typisierten @ManyToOne-, @OneToMany- und @OneToOne-Verknüpfungen inklusive Kaskadierregeln.

Technische Referenz & Architektur-Leitfaden

Entwickler-Handbuch: SQL DDL zu TypeORM Entity Generator (TypeScript-Entities) — Referenz-Leitfaden

Konvertieren Sie SQL CREATE TABLE DDL-Anweisungen in saubere TypeScript TypeORM-Entitätsklassen mit @Column, @PrimaryGeneratedColumn, Relationen und Indizes.

Wichtige Parameter & Steuerelemente

SQL-DialektEnum (PostgreSQL | MySQL | SQLite | SQL Server | Oracle)

Gibt die SQL-Syntax der Zieldatenbank an, die zum Parsen von Spaltendatentypen, Zeichengrenzen, Standardwert-Klauseln und Autoincrement-Primärschlüsseln verwendet wird.

Standard: PostgreSQL
Eigenschafts-NamenskonventionEnum (camelCase mit @Column({ name }) | SQL snake_case beibehalten)

Bestimmt, ob snake_case-Datenbankspalten in idiomatische TypeScript camelCase-Eigenschaften mit expliziten @Column({ name: 'spaltenname' })-Zuordnungen umgewandelt werden.

Standard: camelCase mit @Column({ name })
Relations-GenerierungsstrategieEnum (Bidirektional (@ManyToOne & @OneToMany) | Nur Skalare Fremdschlüssel)

Konfiguriert, ob SQL-Fremdschlüssel vollständige TypeORM-Relationsdekoratoren mit @JoinColumn erzeugen oder reine skalare Fremdschlüsselfelder ohne Navigationsobjekte bleiben.

Standard: Bidirektional (@ManyToOne & @OneToMany)
Zeitstempel-DekoratorenEnum (Automatisch @CreateDateColumn & @UpdateDateColumn | Standard @Column)

Erkennt kanonische Audit-Spalten (wie created_at und updated_at) und versieht sie mit den spezialisierten automatischen Lebenszyklus-Dekoratoren von TypeORM.

Standard: Automatisch @CreateDateColumn & @UpdateDateColumn

Profi-Tipps & Best Practices

Nutzen Sie stets die

Nutzen Sie stets die camelCase-Namenskonvention in Kombination mit explizitem @Column({ name: 'db_spaltenname' }). So bleibt Ihr TypeScript-Code sauber und idiomatisch, während bestehende relationale Tabellen ohne Migrationen 100% kompatibel bleiben.

SQL-Typen wie DECIMAL

SQL-Typen wie DECIMAL(18,4) und BIGINT überschreiten die sichere Ganzzahl-Präzision von JavaScript number. TypeORM bildet DECIMAL standardmäßig auf TypeScript string ab; nutzen Sie Bibliotheken wie decimal.js oder BigInt für exakte Finanzberechnungen.

Definieren Sie Zielentitäts-Referenzen

Definieren Sie Zielentitäts-Referenzen in @ManyToOne- und @OneToMany-Beziehungen immer als Lambda-Funktionen (z. B. @ManyToOne(() => Author, (author) => author.posts)), um zirkuläre Modulimporte zur Laufzeit in Node.js zu verhindern.

Häufige Fallstricke & Fehlerbehebung

TypeORM-Fehler: 'Missing @JoinColumn on entity relation'

In TypeORM ist @JoinColumn() auf der Besitzerseite einer @OneToOne-Beziehung und auf der Fremdschlüsselseite einer @ManyToOne-Beziehung zwingend erforderlich. Stellen Sie sicher, dass @JoinColumn({ name: 'author_id' }) direkt an der Eigenschaft angebracht ist, die den Fremdschlüssel verwaltet.

TypeScript-Compilerfehler: 'Property has no initializer and is not definitely assigned in the constructor'

Wenn strictPropertyInitialization in TypeScript aktiviert ist, müssen Klassenfelder initialisiert werden. Fügen Sie in TypeORM-Entitäten das Ausrufezeichen für die definitive Zuweisung hinzu (z. B. 'title!: string;'), damit der Compiler erkennt, dass TypeORM die Belegung übernimmt.

Häufig gestellte Fragen (FAQ)

Wie bildet der Konverter SQL-Spaltentypen auf TypeScript-Typen und TypeORM-Dekoratoren ab?▼

Die Zuordnung erfolgt zweistufig: Der Dekorator deklariert den physischen Datenbanktyp (z. B. @Column({ type: 'varchar', length: 255 })), während die Klasseneigenschaft den passenden TypeScript-Primitivtyp (z. B. string, number, boolean, Date oder object für JSONB) erhält.

Wie werden Primärschlüssel und Autoincrement-Sequenzen übersetzt?▼

Spalten mit PRIMARY KEY und AUTO_INCREMENT, SERIAL oder IDENTITY werden zu @PrimaryGeneratedColumn('increment'). UUID-Primärschlüssel erhalten @PrimaryGeneratedColumn('uuid'), und nicht generierte zusammengesetzte Schlüssel werden mit @PrimaryColumn() abgebildet.

Können die generierten Entitäten direkt in NestJS-Projekten verwendet werden?▼

Ja. Der erzeugte Code liefert standardmäßige TypeORM-Klassen mit @Entity()-, @Column()- und Relationsdekorationen, die direkt in TypeOrmModule.forFeature([Entity]) von @nestjs/typeorm eingebunden werden können.

Werden meine SQL-DDL-Schemadefinitionen an externe Server gesendet?▼

Nein. Der gesamte Analyse- und TypeScript-Generierungsprozess erfolgt zu 100 % clientseitig im Browser über lokale JavaScript-AST-Parser. Ihre sensiblen Datenbankschemata verlassen zu keinem Zeitpunkt Ihr Gerät.

Verwandte Werkzeuge & Dienstprogramme

Alle Werkzeuge →