SQL CREATE TABLE DDLからZodスキーマへのコンバーター
スキーマモデリングと型安全性

SQL CREATE TABLE DDL to Zod Schema Converter

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

プリセット:
SQLからZodへのコンパイラ設定と型規則
postgres•nullable•camel
入力(4 テーブル)
import { z } from 'zod';

// ============================================================================
// Enums
// ============================================================================

userRoleSchema = z.enum(['SUPERADMIN', 'ORG_ADMIN', 'MEMBER', 'BILLING', 'GUEST']);
UserRole = z.infer<typeof userRoleSchema>;

subscriptionStatusSchema = z.enum(['TRIALING', 'ACTIVE', 'PAST_DUE', 'CANCELED']);
SubscriptionStatus = z.infer<typeof subscriptionStatusSchema>;

// ============================================================================
// Table: organizations
// ============================================================================
organizationsSchema = z.object({
  id: z.string().uuid(),
  slug: z.string().max(64),
  name: z.string().max(255),
  billingEmail: z.string().email().max(255),
  status: subscriptionStatusSchema,
  settings: z.record(z.string(), z.unknown()).nullable(),
  isActive: z.boolean(),
  createdAt: z.coerce.date(),
  updatedAt: z.coerce.date(),
});

Organization = z.infer<typeof organizationsSchema>;

// ============================================================================
// Table: users
// ============================================================================
usersSchema = z.object({
  id: z.string().uuid(),
  organizationId: z.string().uuid(),
  email: z.string().email().max(255),
  fullName: z.string().max(120).nullable(),
  avatarUrl: z.string().url().max(500).nullable(),
  role: userRoleSchema,
  phoneNumber: z.string().max(32).nullable(),
  isVerified: z.boolean(),
  lastLoginAt: z.coerce.date().nullable(),
  createdAt: z.coerce.date(),
});

User = z.infer<typeof usersSchema>;

// ============================================================================
// Table: api_keys
// ============================================================================
apiKeysSchema = z.object({
  id: z.coerce.number().int().positive(),
  organizationId: z.string().uuid(),
  userId: z.string().uuid().nullable(),
  keyPrefix: z.string().max(12),
  hashedSecret: z.string().max(128),
  scopes: z.record(z.string(), z.unknown()),
  expiresAt: z.coerce.date().nullable(),
  revokedAt: z.coerce.date().nullable(),
  createdAt: z.coerce.date(),
});

ApiKey = z.infer<typeof apiKeysSchema>;

// ============================================================================
// Table: audit_logs
// ============================================================================
auditLogsSchema = z.object({
  id: z.coerce.number().int().positive(),
  organizationId: z.string().uuid(),
  actorId: z.string().uuid().nullable(),
  eventName: z.string().max(100),
  ipAddress: z.string().ip().nullable(),
  userAgent: z.string().max(500).nullable(),
  payload: z.record(z.string(), z.unknown()).nullable(),
  createdAt: z.coerce.date(),
});

AuditLog = z.infer<typeof auditLogsSchema>;
Parsed Tables4 schemas ready
マッピングされたカラム36 フィールドの型定義完了
Zodスキーマ数14 個のバリデータを推論

ゼロナレッジ・完全ローカル実行

すべてのデータ処理、解析、コード生成はお使いのブラウザ内部メモリで完結します。外部サーバーへの送信はゼロです。

超高速・即時リアクティブ演算

最適化されたクライアント側解析パイプラインにより、キーストロークと同時に遅延なくリアルタイムで結果を生成します。

公式仕様準拠・高信頼アーキテクチャ

IETF RFCや公式業界仕様に厳格に準拠し、エッジケースの安全な処理とメモリリークのない堅牢な実行を保証します。

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

SQL CREATE TABLE DDLからZodスキーマへのコンバーター — リファレンスガイド

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

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

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

対象とするSQLパーサーの方言を指定します。SERIAL、VARCHAR、DATETIME2、JSONBなどの型、識別子のクォート仕様、制約構文を正確に解釈します。

初期値: PostgreSQL
NULL許容戦略 (Nullability Strategy)Enum (strict-nullable | nullish | optional-defaults)

SQLのNULLおよびDEFAULT句をZod修飾子にマッピングする方法を決定します。厳密な .nullable()、.nullish()(nullまたはundefined)、デフォルト値/自動採番列向けの .optional() から選択します。

初期値: strict-nullable
型強制モード (Type Coercion Mode)Boolean

基本型の検証を z.coerce(z.coerce.number()、z.coerce.date()、z.coerce.boolean() など)でラップし、フォーム送信やURLクエリパラメータの文字列入力を自動型変換してパースします。

初期値: false
日時型の出力形式 (Date Target Format)Enum (Date Instance (z.date()) | ISO String (z.string().datetime()) | Coerced Date (z.coerce.date()))

SQLのTIMESTAMP、DATE、DATETIME型を検証する形式を指定します。JavaScriptのDateインスタンス、ISO 8601文字列、または自動変換付きDateから選択します。

初期値: Date Instance (z.date())
推論型の自動生成 (Generate Inferred Types)Boolean

z.infer<typeof schema> から導出されるTypeScript型定義(SELECT用の全列型およびINSERT用の入力型)を自動的に出力します。

初期値: true

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

INSERT用スキーマとSELECT用スキーマの分離設計

リレーショナルDBでは、AUTO_INCREMENTやSERIALなどの主キーやDEFAULT値を持つ列はレコード挿入時に自動生成されます。基本スキーマを定義し、挿入用スキーマには .omit({ id: true, createdAt: true }) を適用するか、該当列を .optional() に設定するのがベストプラクティスです。

JSON / JSONB 列には専用のネストスキーマを適用

SQL DDLにおけるJSON型やJSONB型はデフォルトで z.record(z.any()) や z.unknown() として変換されます。型安全性を高めるため、実際のデータ構造に合わせた専用のZodネストスキーマへ差し替えて検証を強化してください。

BIGINT および高精度 DECIMAL の桁あふれ・精度落ち対策

JavaScriptの標準Number型は 2^53 - 1 を超えると精度落ちが発生します。SQLのBIGINTやNUMERIC / DECIMALを扱う場合は、ID列には z.bigint() または z.string()、金額などの高精度数値には z.string().regex(/^\d+\.\d{2}$/) を使用して浮動小数点誤差を防ぎます。

データベースがsnake_caseでType

データベースがsnake_caseでTypeScript側がcamelCaseを採用している場合、Zodの .transform((data) => ({ ... })) や .pipe() パイプラインを活用することで、DBスキーマを変更することなく実行時にキー名を自動変換できます。

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

APIリクエスト検証時に「ZodError: Expected date, received string」が発生する

JSONペイロードでは日時はISO 8601文字列として送信されるため、直接 z.date() を適用すると失敗します。日時型の形式を「ISO String (z.string().datetime())」に変更するか、「型強制モード (z.coerce.date())」を有効にして文字列からDateオブジェクトへの自動変換を行ってください。

PostgreSQLのENUM型やカスタムドメインでパースエラーが発生する

テーブル定義の前に CREATE TYPE 宣言が含まれているか、列のインラインCHECK制約が正確に記述されているか確認してください。列の CHECK (col IN (...)) 句やカスタムENUMは自動的に z.enum([...]) として変換されます。

自動採番主キー(SERIAL / AUTO_INCREMENT)がINSERT用データ検証でエラーになる

DB定義上NOT NULLであっても、クライアントからのINSERT時にはIDは送信されません。NULL許容戦略を「optional-defaults」に設定するか、導出した挿入用スキーマで .omit({ id: true }) を適用して未指定を許容してください。

よくある質問 (FAQ)

SQLのNULL許容列およびNOT NULL列はZodスキーマにどのようにマッピングされますか?▼

NOT NULL制約のない列はSQL上でNULL許容となるため、.nullable() が付与されます。DEFAULT句が指定されている列や自動採番列は、設定に応じて .optional() や .nullish()(nullおよびundefinedの両方を許容)として出力され、API入力時の仕様に合致させることができます。

z.date()、z.coerce.date()、z.string().datetime() の使い分けはどうすべきですか?▼

z.date() は値がすでにJavaScriptのDateオブジェクトである場合(DrizzleやPrismaの戻り値など)に使用します。z.string().datetime() はISO 8601文字列のまま保持・検証する場合に適しています。z.coerce.date() は文字列やUnixタイムスタンプを受け取り、パース時に自動で new Date(val) を実行してDateインスタンスに変換します。

生成されたZodスキーマはDrizzle、Prisma、KyselyなどのORMと連携できますか?▼

はい、完全に連携可能です。APIエンドポイントやNext.jsのServer Actionsでクライアントからの入力をZodスキーマで実行時検証した上で、型安全なデータを各種ORMやクエリビルダーの挿入・更新メソッドに渡すアーキテクチャが一般的です。

入力したSQL DDL定義が外部サーバーやクラウドに送信されることはありますか?▼

いいえ、一切ありません。SQLの字句解析、構文解析、AST生成、およびTypeScriptコードの生成処理はすべてブラウザ内部のWeb Workersで完結します。テーブル構造やDDLコードが外部ネットワークへ送信されることはありません。

SQLのCHECK制約や外部キー制約はどのようにZodに反映されますか?▼

値リストを指定したCHECK制約(例: CHECK (status IN ('active', 'inactive')))は z.enum() に変換されます。数値範囲(例: CHECK (age >= 18))は .min(18) などのバリデーション条件に変換されます。外部キー列は参照先のプリミティブ型(z.string().uuid() や z.number().int() など)を維持します。

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

すべてのツール →
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のランタイム検証および静的型推論を実現します。

ツールを開く→
Prisma スキーマ → SQL DDL 移行ジェネレーター開発ツール

Prismaスキーマ(.prisma)からPostgreSQL、MySQL、SQLite向けSQL DDLマイグレーションスクリプトへの変換ガイド。

ツールを開く→