SQLからDrizzle変換

SQL DDLからDrizzle ORMスキーマへのジェネレーター(PostgreSQL、MySQL、SQLite)

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

プリセット:
データベースダイアレクト:
スキーマ構文:
カラムキー記法:
SQL DDL文PostgreSQL
import {
  boolean,
  index,
  integer,
  jsonb,
  numeric,
  pgEnum,
  pgTable,
  serial,
  text,
  timestamp,
  uniqueIndex,
  uuid,
  varchar
} from 'drizzle-orm/pg-core';
import { relations } from 'drizzle-orm';
import { createSelectSchema, createInsertSchema } from 'drizzle-zod';

// Enums
export const userRoleEnum = pgEnum('user_role', ['CUSTOMER', 'ADMIN', 'VENDOR']);

export const orderStatusEnum = pgEnum('order_status', ['PENDING', 'PAID', 'PROCESSING', 'SHIPPED', 'DELIVERED', 'CANCELLED']);


// Tables
export const users = pgTable('users', {
  id: uuid('id').defaultRandom().primaryKey(),
  email: varchar('email', { length: 255 }).notNull().unique(),
  fullName: varchar('full_name', { length: 120 }),
  role: userRoleEnum('role').notNull().default('CUSTOMER'),
  isActive: boolean('is_active').notNull().default(true),
  metadata: jsonb('metadata'),
  createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
  updatedAt: timestamp('updated_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
});

export const userProfiles = pgTable('user_profiles', {
  id: uuid('id').defaultRandom().primaryKey(),
  userId: uuid('user_id').notNull().unique().references(() => users.id, { onDelete: 'cascade' }),
  avatarUrl: varchar('avatar_url', { length: 500 }),
  phone: varchar('phone', { length: 30 }),
  shippingAddress: text('shipping_address'),
  taxIdentifier: varchar('tax_identifier', { length: 50 }),
});

export const products = pgTable('products', {
  id: serial('id').primaryKey(),
  sku: varchar('sku', { length: 64 }).notNull().unique(),
  title: varchar('title', { length: 200 }).notNull(),
  description: text('description'),
  price: numeric('price', { precision: 10, scale: 2 }).notNull().default(0.00),
  inventory: integer('inventory').notNull().default(0),
  isPublished: boolean('is_published').notNull().default(true),
  createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
}, (table) => [
  index('idx_products_sku').on(table.sku)
]);

export const orders = pgTable('orders', {
  id: uuid('id').defaultRandom().primaryKey(),
  customerId: uuid('customer_id').notNull().references(() => users.id, { onDelete: 'restrict' }),
  orderNumber: varchar('order_number', { length: 64 }).notNull().unique(),
  status: orderStatusEnum('status').notNull().default('PENDING'),
  totalAmount: numeric('total_amount', { precision: 12, scale: 2 }).notNull().default(0.00),
  notes: text('notes'),
  createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),
}, (table) => [
  index('idx_orders_customer').on(table.customerId)
]);

export const orderItems = pgTable('order_items', {
  id: serial('id').primaryKey(),
  orderId: uuid('order_id').notNull().references(() => orders.id, { onDelete: 'cascade' }),
  productId: integer('product_id').notNull().references(() => products.id, { onDelete: 'restrict' }),
  quantity: integer('quantity').notNull().default(1),
  unitPrice: numeric('unit_price', { precision: 10, scale: 2 }).notNull(),
}, (table) => [
  uniqueIndex('uq_order_product').on(table.orderId, table.productId)
]);


// Relations
export const usersRelations = relations(users, ({ many }) => ({
  userProfileses: many(userProfiles),
  orderses: many(orders),
}));

export const userProfilesRelations = relations(userProfiles, ({ one }) => ({
  user: one(users, {
    fields: [userProfiles.userId],
    references: [users.id],
  }),
}));

export const productsRelations = relations(products, ({ many }) => ({
  orderItemses: many(orderItems),
}));

export const ordersRelations = relations(orders, ({ one, many }) => ({
  customer: one(users, {
    fields: [orders.customerId],
    references: [users.id],
  }),
  orderItemses: many(orderItems),
}));

export const orderItemsRelations = relations(orderItems, ({ one }) => ({
  order: one(orders, {
    fields: [orderItems.orderId],
    references: [orders.id],
  }),
  product: one(products, {
    fields: [orderItems.productId],
    references: [products.id],
  }),
}));


// TypeScript Inferred Types
export type User = typeof users.$inferSelect;
export type NewUser = typeof users.$inferInsert;
export type UserProfile = typeof userProfiles.$inferSelect;
export type NewUserProfile = typeof userProfiles.$inferInsert;
export type Product = typeof products.$inferSelect;
export type NewProduct = typeof products.$inferInsert;
export type Order = typeof orders.$inferSelect;
export type NewOrder = typeof orders.$inferInsert;
export type OrderItem = typeof orderItems.$inferSelect;
export type NewOrderItem = typeof orderItems.$inferInsert;

// Drizzle-Zod Schemas
export const selectUserSchema = createSelectSchema(users);
export const insertUserSchema = createInsertSchema(users);
export const selectUserProfileSchema = createSelectSchema(userProfiles);
export const insertUserProfileSchema = createInsertSchema(userProfiles);
export const selectProductSchema = createSelectSchema(products);
export const insertProductSchema = createInsertSchema(products);
export const selectOrderSchema = createSelectSchema(orders);
export const insertOrderSchema = createInsertSchema(orders);
export const selectOrderItemSchema = createSelectSchema(orderItems);
export const insertOrderItemSchema = createInsertSchema(orderItems);
解析されたテーブル5識別されたスキーマモデル
変換されたカラム34型付きテーブル属性
外部キーPostgreSQL
4リレーション参照とリンク

完全ローカル・ゼロアップロード

すべてのSQL解析とTypeScriptスキーマ生成はブラウザ内のサンドボックスで100%実行されます。データベース構成が外部サーバーに送信されることは一切ありません。

高精度マルチダイアレクト対応

pgTable(PostgreSQL)、mysqlTable(MySQL)、sqliteTable(SQLite)を完全サポート。型マッピング、ENUM、インデックス、制約を忠実に再現します。

型安全なリレーションと型推論

Drizzle ORMの型付きrelations()、$inferSelect、$inferInsert型、本番対応のdrizzle-zodバリデーションスキーマを自動生成します。

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

SQL DDL から Drizzle ORM スキーマへの変換ジェネレーター (PostgreSQL, MySQL, SQLite) — リファレンスガイド

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

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

対象ダイアレクト (Target Dialect)Enum ('postgresql' | 'mysql' | 'sqlite')

変換対象のデータベース製品と、インポートするDrizzleコアパッケージ (drizzle-orm/pg-core, drizzle-orm/mysql-core, drizzle-orm/sqlite-core) を指定します。

初期値: postgresql
カラムプロパティ命名規則 (Column Casing)Enum ('camelCase' | 'snake_case')

TypeScript側のスキーマプロパティキーをキャメルケース (camelCase) に自動変換するか、DB本来のスネークケース (snake_case) を維持するかを設定します。

初期値: camelCase
型推論宣言の生成 ($inferSelect / $inferInsert)Boolean

各テーブルに対応するTypeScript型定義 (typeof table.$inferSelect および typeof table.$inferInsert) を自動的に末尾へ生成します。

初期値: true
エクスポート形式 (Export Syntax)Enum ('named' | 'schema-object')

各テーブル定義を個別の名前付き定数 (export const users = ...) として出力するか、1つのスキーマオブジェクトにまとめて出力するかを選択します。

初期値: named

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

外部キー参照の遅延評価構文

SQLのREFERENCES句は .references(() => otherTable.id) のアロー関数コールバックに自動変換され、テーブル間の循環参照や評価順序によるエラーを回避します。

PostgreSQL pgEnum の自動抽出

PostgreSQLの CREATE TYPE ... AS ENUM 構文を検出し、TypeScriptのUnion型推論に対応した独立した pgEnum() 宣言として書き出します。

複合主キーとインデックスの定義

複数カラムによる複合 PRIMARY KEY や複合 UNIQUE、インデックスは、テーブル定義の第3引数である (table) => [...] コールバック内に正確に集約されます。

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

ベンダー固有のSQL構文やトリガーによるパースエラー

ENGINE=InnoDB やパーティション句などのRDBMS固有構文やストアドプロシージャを削除し、標準的な CREATE TABLE DDL のみを貼り付けてください。

循環参照によるTypeScriptのホイスティング・型エラー

Drizzle推奨のアロー関数参照記法 .references(() => otherTable.id) を使用するか、リレーション専用の relations() 定義を別ファイルへ分割してください。

よくある質問 (FAQ)

自動採番 (AUTO_INCREMENT / SERIAL) はどのように変換されますか?▼

PostgreSQLでは SERIAL や BIGSERIAL が serial() / bigserial() に変換され、MySQLでは AUTO_INCREMENT が .autoincrement() に、SQLiteでは integer().primaryKey({ autoIncrement: true }) に正しくマッピングされます。

生成されたスキーマは drizzle-kit push や migrate で直接利用できますか?▼

はい。Drizzle ORM公式の仕様に完全準拠したTypeScriptコードを出力するため、drizzle-kitのマイグレーション生成やプッシュ、Drizzle Studioでそのまま使用可能です。

NULL許容性 (NOT NULL) やデフォルト値 (DEFAULT) はどのように処理されますか?▼

NOT NULLが指定されていないカラムはDrizzleの仕様通りデフォルトでnull許容となり、NOT NULL指定がある場合は .notNull() が、DEFAULT句は .default(...) や $defaultFn() に変換されます。

入力したSQLクエリやテーブル定義がサーバーに送信されることはありますか?▼

いいえ。SQLの字句解析・構文解析およびTypeScriptコードの生成処理はすべてブラウザ上のクライアントサイドJavaScriptで実行され、外部サーバーへの通信は一切発生しません。

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

すべてのツール →
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マイグレーションスクリプトへの変換ガイド。

ツールを開く→
Prismaスキーマ TypeScript 型定義変換ガイド開発ツール

Prismaスキーマのmodelやenum、リレーションを解析し、Prisma Clientランタイム不要の純粋なTypeScript型定義(interface / type)を即時生成。

ツールを開く→
OpenAPI & SwaggerからAxios TypeScript APIクライアント生成開発ツール

OpenAPI 3.0およびSwaggerのJSON/YAML仕様書から、型安全で保守性の高いAxios HTTPクライアント関数とパラメータインターフェースを自動生成します。

ツールを開く→
OpenAPI・Swagger ネイティブFetchクライアント自動生成 開発者向け技術リファレンス開発ツール

依存関係ゼロの標準Fetch APIを活用したTypeScriptクライアントコードを生成。クエリ文字列のシリアライズ、ヘッダー設定、型定義を自動完結。

ツールを開く→