SQL DDL から TypeORM エンティティ生成ツール(TypeScript エンティティ)

SQL DDL から TypeORM エンティティ生成ツール (TypeScript)

SQL の CREATE TABLE DDL 文を、@Column、@PrimaryGeneratedColumn、リレーションデコレータを備えたクリーンな TypeScript TypeORM エンティティクラスに変換します。

プリセット:
DB 方言:クラス命名規則:プロパティ命名規則:
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;
}

生成エンティティ数5 個のエンティティ生成
リレーション解決数4 個の外部キーマッピング
マッピング列数37 個のカラム変換

100% クライアントサイド処理・完全プライバシー

外部サーバーへの通信やDB接続は一切発生しません。すべてのSQL構文解析とTypeScriptエンティティ生成はブラウザ内のサンドボックスで安全に完結します。

高度なTypeORMデコレータ自動付与

主キー(@PrimaryGeneratedColumn, @PrimaryColumn)、列型、桁数、デフォルト値、@CreateDateColumn、@UpdateDateColumn、@Index、@Uniqueを自動構成します。

複数DB方言と双方向リレーション対応

PostgreSQL、MySQL、SQLite、SQL ServerのDDLに対応し、@ManyToOne、@OneToMany、@OneToOneの型安全な双方向リレーションとカスケード設定を生成します。

技術リファレンス&アーキテクチャガイド

SQL DDL から TypeORM エンティティ生成ツール(TypeScript エンティティ) — リファレンスガイド

SQL の CREATE TABLE DDL 文を、@Column、@PrimaryGeneratedColumn、リレーションデコレータを備えたクリーンな TypeScript TypeORM エンティティクラスに変換します。

主要パラメータ&設定項目

SQL方言 (SQL Dialect)Enum (PostgreSQL | MySQL | SQLite | SQL Server | Oracle)

カラムのデータ型、文字数制限、デフォルト値制約句、自動増分主キーの解析に使用するターゲットデータベースのSQL構文を指定します。

初期値: PostgreSQL
プロパティ命名戦略 (Property Naming Strategy)Enum (camelCase with @Column({ name }) | Preserve SQL snake_case)

データベースの snake_case カラム名を、明示的な @Column({ name: 'column_name' }) マッピングを付与した慣用的な TypeScript の camelCase プロパティに変換するかどうかを設定します。

初期値: camelCase with @Column({ name })
リレーション生成戦略 (Relation Generation Strategy)Enum (Bidirectional (@ManyToOne & @OneToMany) | Scalar Foreign Keys Only)

SQL 外部キー制約から @JoinColumn を含む双方向 TypeORM リレーションデコレータを生成するか、ナビゲーションプロパティを持たない純粋なスカラー外部キーフィールドとして保持するかを設定します。

初期値: Bidirectional (@ManyToOne & @OneToMany)
タイムスタンプデコレータ (Timestamp Decorators)Enum (Automatic @CreateDateColumn & @UpdateDateColumn | Standard @Column)

created_at や updated_at などの標準的な監査カラムを自動検出し、TypeORM 固有の自動ライフサイクルタイムスタンプアノテーションを付与します。

初期値: Automatic @CreateDateColumn & @UpdateDateColumn

プロの活用テクニック&推奨設定

明示的な @Column(name) 属性でデータベーススキーマの整合性を維持

明示的な @Column({ name: 'db_col_name' }) マッピングを伴う camelCase 命名戦略を常に推奨します。既存のデータベーステーブルとの互換性を完全に保ちながら、TypeScript アプリケーションコードを美しく整理できます。

DECIMAL および BIGINT フィールドでの浮動小数点精度の欠落を防止

DECIMAL(18,4) や BIGINT などの SQL 型は、JavaScript の number 型の安全な整数精度を超えます。TypeORM はデフォルトで DECIMAL を TypeScript の string にマップします。正確な金額計算には decimal.js や BigInt の使用を推奨します。

リレーションで ES6 アロー関数を使用して循環参照エラーを回避

分割されたエンティティファイル間で @ManyToOne や @OneToMany リレーションを定義する際は、ターゲットエンティティの参照をラムダ関数(例: @ManyToOne(() => Author, (author) => author.posts))として定義し、Node.js のモジュール循環インポートエラーを回避してください。

よくあるトラブルと解決策

TypeORM エラー: 'Missing @JoinColumn on entity relation'

TypeORM では、@OneToOne リレーションの所有者側および @ManyToOne リレーションの外部キー側に @JoinColumn() が必須です。物理的な外部キーカラムを保持するプロパティの直前に @JoinColumn({ name: 'author_id' }) が配置されていることを確認してください。

TypeScript コンパイルエラー: 'Property has no initializer and is not definitely assigned in the constructor'

strictPropertyInitialization が有効な TypeScript 環境では、クラスフィールドの初期化が必要です。TypeORM エンティティでは、確定的代入アサーションエクスクラメーションマーク(例: 'title!: string;')を付与して、TypeORM が値を注入することをコンパイラに認識させてください。

よくある質問 (FAQ)

SQL カラムのデータ型は TypeScript の型と TypeORM デコレータにどのように変換されますか?▼

SQL 型は二層でマッピングされます。デコレータには物理的なデータベース型(例: @Column({ type: 'varchar', length: 255 }))が指定され、プロパティ自体には対応する TypeScript プリミティブ(string、number、boolean、Date、JSONB の場合は object など)が型定義されます。

主キーや自動増分シーケンスはどのようにマッピングされますか?▼

PRIMARY KEY かつ AUTO_INCREMENT、SERIAL、IDENTITY のカラムは @PrimaryGeneratedColumn('increment') に変換されます。UUID 主キーは @PrimaryGeneratedColumn('uuid')、自動生成されない複合主キーは @PrimaryColumn() として定義されます。

生成されたエンティティは NestJS プロジェクトでそのまま使用できますか?▼

はい。生成されたコードは @Entity()、@Column()、リレーションデコレータを備えた標準的な TypeORM TypeScript クラスであるため、@nestjs/typeorm の TypeOrmModule.forFeature([Entity]) にそのまま直接登録できます。

変換時に SQL DDL スキーマが外部サーバーに送信されることはありますか?▼

いいえ。解析およびエンティティ生成の処理は、ブラウザ内のローカル JavaScript 構文解析エンジンによって 100% クライアントサイドで完結します。機密性の高いスキーマ情報が外部ネットワークに送信されることは一切ありません。

関連するおすすめ開発ツール

すべてのツール →
SQL CREATE TABLE DDLからZodスキーマへのコンバーター開発ツール

SQLテーブルスキーマ、データ型、制約条件、NULL許容列を厳密に型付けされたTypeScript Zodオブジェクトスキーマに変換します。

ツールを開く→
Docker Compose から Kubernetes マニフェスト変換ツール(Compose to K8s)開発ツール

docker-compose.yml のサービス、環境変数、ポート公開、ボリューム設定を Kubernetes の Deployment および Service YAML マニフェストに完全変換します。

ツールを開く→
JSONから.env環境変数への変換ツール(平坦化とエクスポート)開発ツール

ネストされたJSONペイロードをカスタマイズ可能な区切り文字とプレフィックスオプションを使用して大文字SNAKE_CASEの.env設定に平坦化します。

ツールを開く→
SQL DDL から Drizzle ORM スキーマへの変換ジェネレーター (PostgreSQL, MySQL, SQLite)開発ツール

SQLのCREATE TABLE文を、pgTable、mysqlTable、sqliteTableの定義を含む型安全なDrizzle ORMスキーマコードに即座に変換します。

ツールを開く→
JSONからValibotスキーマ生成(モジュラーTypeScriptバリデーション)開発ツール

JSONデータをv.object、v.string、v.number、配列バリデータを含む軽量でツリーシェイカブルなValibotスキーマ定義に瞬時に変換します。

ツールを開く→
JSON to TypeBox スキーマジェネレーター開発ツール

JSON構造を高パフォーマンスなTypeBoxのType.Object定義へ変換し、Fastify、Ajv、TypeScriptのランタイム検証および静的型推論を実現します。

ツールを開く→