SQL vers TypeORM

Générateur d'Entités TypeORM depuis SQL DDL (TypeScript)

Convertissez vos instructions SQL CREATE TABLE DDL en classes d'entités TypeScript TypeORM propres avec @Column, @PrimaryGeneratedColumn, relations et index.

Préréglages :
Dialecte SQL:Nommage des Classes:Style de propriété :
Entrée 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;
}

Entités TypeORM5 entités générées
Relations Résolues4 clés étrangères mappées
Colonnes Mappées37 colonnes converties

Confidentialité 100% Côté Client

Aucun envoi vers un serveur ni connexion directe. L'analyse du code SQL et la génération des entités TypeORM s'effectuent exclusivement dans votre navigateur.

Décorateurs TypeORM Intelligents

Génération automatique des clés primaires (@PrimaryGeneratedColumn, @PrimaryColumn), types de colonnes, @CreateDateColumn, @UpdateDateColumn, @Index et @Unique.

Multi-Dialecte & Relations Bidirectionnelles

Prise en charge de PostgreSQL, MySQL, SQLite et SQL Server avec relations typées @ManyToOne, @OneToMany et @OneToOne avec options CASCADE.

Référence technique et guide d'architecture

Guide Développeur : Générateur d'entités TypeORM à partir de DDL SQL (Entités TypeScript) — Guide de référence

Convertissez vos instructions SQL CREATE TABLE DDL en classes d'entités TypeScript TypeORM propres avec @Column, @PrimaryGeneratedColumn, relations et index.

Paramètres clés et contrôles

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

Spécifie la syntaxe de base de données SQL utilisée pour analyser les types de données de colonnes, limites de caractères, clauses par défaut et clés primaires auto-incrémentées.

Par défaut : PostgreSQL
Convention de Nommage des PropriétésEnum (camelCase avec @Column({ name }) | Conserver le snake_case SQL)

Détermine si les colonnes en snake_case de la base de données sont converties en propriétés idiomatiques camelCase en TypeScript avec mappages explicites @Column({ name: 'nom_colonne' }).

Par défaut : camelCase avec @Column({ name })
Stratégie de Génération des RelationsEnum (Bidirectionnelle (@ManyToOne & @OneToMany) | Clés étrangères scalaires uniquement)

Configure si les contraintes de clés étrangères SQL génèrent des décorateurs de relation TypeORM complets avec @JoinColumn ou conservent des champs scalaires simples sans propriétés d'objet.

Par défaut : Bidirectionnelle (@ManyToOne & @OneToMany)
Décorateurs d'HorodatageEnum (Automatique @CreateDateColumn & @UpdateDateColumn | Standard @Column)

Détecte les colonnes d'audit conventionnelles (comme created_at et updated_at) et leur applique les annotations spécialisées de cycle de vie automatique de TypeORM.

Par défaut : Automatique @CreateDateColumn & @UpdateDateColumn

Conseils de pro et bonnes practices

Adoptez toujours la convention de

Adoptez toujours la convention de nommage camelCase couplée à un mappage explicite @Column({ name: 'db_col_name' }). Cela garantit un code applicatif TypeScript propre tout en maintenant une compatibilité parfaite avec les tables SQL existantes sans migration.

Les types SQL tels que DECIMAL

Les types SQL tels que DECIMAL(18,4) et BIGINT dépassent la précision entière maximale des numbers en JavaScript. TypeORM mappe par défaut DECIMAL vers string en TypeScript ; utilisez des bibliothèques comme decimal.js ou BigInt pour les calculs financiers critiques.

Lors de la configuration des relations

Lors de la configuration des relations @ManyToOne et @OneToMany entre différents fichiers d'entités, déclarez toujours l'entité cible sous forme de fonction lambda (ex. @ManyToOne(() => Author, (author) => author.posts)) pour éviter les blocages d'importations circulaires dans Node.js.

Pièges courants et dépannage

Erreur TypeORM : 'Missing @JoinColumn on entity relation'

Dans TypeORM, @JoinColumn() est obligatoire sur le côté propriétaire d'une relation @OneToOne et sur le côté clé étrangère d'une relation @ManyToOne. Veillez à placer @JoinColumn({ name: 'author_id' }) sur la propriété qui porte physiquement la clé étrangère.

Erreur de compilation TypeScript : 'Property has no initializer and is not definitely assigned in the constructor'

Lorsque strictPropertyInitialization est activé dans TypeScript, les champs de classe doivent être initialisés. Dans vos entités TypeORM, ajoutez le point d'exclamation d'assertion d'assignation définitive (ex. 'title!: string;') pour indiquer au compilateur que TypeORM injecte la valeur.

Foire aux questions (FAQ)

Comment le convertisseur fait-il correspondre les types de colonnes SQL avec TypeScript et TypeORM ?▼

La conversion fonctionne sur deux niveaux : le décorateur spécifie le type physique de base de données (ex. @Column({ type: 'varchar', length: 255 })), tandis que la propriété TypeScript reçoit le type primitif adéquat (string, number, boolean, Date ou object pour le JSONB).

Comment les clés primaires et auto-incrémentations sont-elles converties ?▼

Les colonnes définies avec PRIMARY KEY et AUTO_INCREMENT, SERIAL ou IDENTITY sont converties en @PrimaryGeneratedColumn('increment'). Les clés primaires UUID utilisent @PrimaryGeneratedColumn('uuid'), et les clés composites non générées utilisent @PrimaryColumn().

Les entités générées peuvent-elles être utilisées directement dans des projets NestJS ?▼

Oui. Le code généré fournit des classes TypeScript TypeORM standards dotées des décorateurs @Entity(), @Column() et de relation, directement utilisables avec le module TypeOrmModule.forFeature([Entity]) de @nestjs/typeorm.

Mes schémas SQL DDL sont-ils transmis à un serveur externe lors de la conversion ?▼

Non. L'intégralité de l'analyse syntaxique et de la génération des entités TypeScript s'exécute à 100 % côté client dans votre navigateur via un parseur JavaScript local. Vos schémas propriétaires ne quittent jamais votre environnement de travail.

Outils et utilitaires connexes

Tous les outils →
Guide du Développeur pour le Convertisseur SQL CREATE TABLE DDL vers Schéma ZodDéveloppement

Traduisez les schémas de tables SQL, types de données, contraintes et colonnes nullables en schémas d'objets Zod fortement typés pour TypeScript.

Ouvrir l'outil→
Convertisseur Docker Compose vers Manifestes Kubernetes (Compose vers K8s) - Guide DéveloppeurDéveloppement

Convertissez les services, variables d'environnement, ports et montages de volumes docker-compose.yml en manifestes YAML Kubernetes Deployment et Service.

Ouvrir l'outil→
Guide du Développeur : Convertisseur JSON en Variables d'Environnement .env (Aplatir & Exporter)Développement

Aplatissez les charges utiles JSON imbriquées en configurations .env en SNAKE_CASE majuscule avec délimiteurs et préfixes personnalisables.

Ouvrir l'outil→
Générateur de Schémas SQL DDL vers Drizzle ORM (PostgreSQL, MySQL, SQLite) - Guide DéveloppeurDéveloppement

Convertissez vos instructions SQL CREATE TABLE en schémas Drizzle ORM fortement typés avec des définitions pgTable, mysqlTable et sqliteTable.

Ouvrir l'outil→
Guide Développeur : Générateur de Schémas Valibot depuis JSON (Validation TypeScript Modulaire)Développement

Transformez vos données JSON en définitions de schémas Valibot légères et compatibles tree-shaking avec v.object, v.string, v.number et des validateurs de tableaux.

Ouvrir l'outil→
Générateur de Schémas JSON vers TypeBox - Guide DéveloppeurDéveloppement

Convertissez des structures JSON en définitions TypeBox Type.Object haute performance pour Fastify, Ajv et la validation TypeScript à l'exécution.

Ouvrir l'outil→