SQLからKysely変換

SQL DDL から Kysely TypeScript 型定義生成ツール

PostgreSQL、MySQL、SQLiteのSQL DDLスキーマを解析し、完全な型安全性を備えたKysely向けTypeScript型定義とインターフェースを生成するための開発者向けリファレンス。

プリセット:
対象DB方言:
インターフェース命名:
カラム名スタイル:
SQL CREATE TABLE DDLPostgreSQL
/**
 * Generated by ToolsAA SQL to Kysely TypeGen
 * Target Dialect: POSTGRES
 * Generated Tables: 4
 */

import type { ColumnType, Generated, Insertable, Selectable, Updateable } from 'kysely';


// ==========================================
// Enums & Custom Value Types
// ==========================================
export type UserRole = 'OWNER' | 'ADMIN' | 'MEMBER' | 'BILLING_CONTACT';
export type SubscriptionStatus = 'TRIALING' | 'ACTIVE' | 'PAST_DUE' | 'CANCELED' | 'INCOMPLETE';
export type InvoiceStatus = 'DRAFT' | 'OPEN' | 'PAID' | 'UNCOLLECTIBLE' | 'VOID';

// ==========================================
// Table Interfaces
// ==========================================
export interface OrganizationsTable {
  id: Generated<string>; // PRIMARY KEY | DEFAULT: gen_random_uuid()
  slug: string;
  name: string;
  settings: ColumnType<Record<string, unknown> | null, string | Record<string, unknown> | null, string | Record<string, unknown> | null | undefined>;
  is_active: Generated<boolean>; // DEFAULT: true
  created_at: Generated<Date>; // DEFAULT: CURRENT_TIMESTAMP
  updated_at: Generated<Date>; // DEFAULT: CURRENT_TIMESTAMP
}

export interface UsersTable {
  id: Generated<string>; // PRIMARY KEY | DEFAULT: gen_random_uuid()
  organization_id: string; // FK -> organizations.id
  email: string;
  full_name: string | null;
  role: Generated<UserRole>; // DEFAULT: MEMBER
  avatar_url: string | null;
  last_login_at: Date | null;
  created_at: Generated<Date>; // DEFAULT: CURRENT_TIMESTAMP
}

export interface SubscriptionsTable {
  id: Generated<string>; // PRIMARY KEY | DEFAULT: gen_random_uuid()
  organization_id: string; // FK -> organizations.id
  stripe_customer_id: string;
  stripe_subscription_id: string | null;
  plan_tier: Generated<string>; // DEFAULT: starter
  seat_count: Generated<number>; // DEFAULT: 5
  status: Generated<SubscriptionStatus>; // DEFAULT: TRIALING
  current_period_start: Date;
  current_period_end: Date;
  cancel_at_period_end: Generated<boolean>; // DEFAULT: false
  created_at: Generated<Date>; // DEFAULT: CURRENT_TIMESTAMP
}

export interface InvoicesTable {
  id: Generated<string>; // PRIMARY KEY | DEFAULT: gen_random_uuid()
  organization_id: string; // FK -> organizations.id
  subscription_id: string | null; // FK -> subscriptions.id
  invoice_number: string;
  subtotal_cents: Generated<number>; // DEFAULT: 0
  tax_cents: Generated<number>; // DEFAULT: 0
  total_cents: Generated<number>; // DEFAULT: 0
  currency: Generated<string>; // DEFAULT: USD
  status: Generated<InvoiceStatus>; // DEFAULT: OPEN
  paid_at: Date | null;
  line_items: ColumnType<Record<string, unknown>, string | Record<string, unknown>, string | Record<string, unknown> | undefined>;
  created_at: Generated<Date>; // DEFAULT: CURRENT_TIMESTAMP
}

// ==========================================
// Master Database Interface
// ==========================================
export interface Database {
  organizations: OrganizationsTable;
  users: UsersTable;
  subscriptions: SubscriptionsTable;
  invoices: InvoicesTable;
}

// ==========================================
// Convenience Entity Models (Select / Insert / Update)
// ==========================================
export type Organization = Selectable<OrganizationsTable>;
export type NewOrganization = Insertable<OrganizationsTable>;
export type OrganizationUpdate = Updateable<OrganizationsTable>;

export type User = Selectable<UsersTable>;
export type NewUser = Insertable<UsersTable>;
export type UserUpdate = Updateable<UsersTable>;

export type Subscription = Selectable<SubscriptionsTable>;
export type NewSubscription = Insertable<SubscriptionsTable>;
export type SubscriptionUpdate = Updateable<SubscriptionsTable>;

export type Invoic = Selectable<InvoicesTable>;
export type NewInvoic = Insertable<InvoicesTable>;
export type InvoicUpdate = Updateable<InvoicesTable>;
解析テーブル数4検出された独立エンティティ
変換カラム数38型定義された属性
リレーション&制約PostgreSQL
4主キーおよび外部キー

完全ローカル&ゼロ送信プライバシー

すべてのSQL解析とTypeScriptインターフェース生成はブラウザ内のサンドボックスで100%完結。データベース設計が外部に送信されることはありません。

Kysely高精度型推論

SQLのデータ型をTypeScriptに正確にマッピング。AUTO_INCREMENTやデフォルト値をGenerated<T>でラップし、JSON型にはColumnTypeを提供します。

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

Kyselyクエリビルダーですぐに使えるDatabaseインターフェースに加え、Selectable、Insertable、Updateableの各補助型を自動生成します。

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

SQL DDL から Kysely TypeScript 型定義生成ツール — リファレンスガイド

PostgreSQL、MySQL、SQLiteのSQL DDLスキーマを解析し、完全な型安全性を備えたKysely向けTypeScript型定義とインターフェースを生成するための開発者向けリファレンス。

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

dialect'postgres' | 'mysql' | 'sqlite'

方言固有のデータ型変換および制約構文のマッピングを制御する対象SQLデータベースエンジン。

初期値: 'postgres'
variableCasing'pascal' | 'snake' | 'raw'

生成されるTypeScriptテーブルインターフェースおよびエクスポートされるモデル識別子の命名規則。

初期値: 'pascal'
columnCasing'raw' | 'camel'

ネイティブSQLスキーマまたはKyselyのCamelCasePluginに適合させるテーブルプロパティの列名変換戦略。

初期値: 'raw'
outputTab'schema' | 'multifile' | 'relations' | 'config'

単一のdatabase.ts、分割マルチファイル、リレーション型定義、またはクライアント初期化設定の出力構造を選択。

初期値: 'schema'

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

Generated型の正確な適用

自動インクリメント、SERIAL、DEFAULT値を持つ列にはKyselyのGenerated<T>またはColumnType<Select, Insert, Update>を適用してください。これによりSELECT時の非NULL保証を保ちながらINSERT時の省略を型レベルで安全に許可できます。

CamelCaseプラグイン連携

columnCasingを'camel'に指定する場合、Kysely初期化時に必ずnew Kysely({ plugins: [new CamelCasePlugin()] })を構成してください。未構成のまま実行するとSQLエンジンへ直接キャメルケース名が送られ、未定義列エラーの原因となります。

JSONB型の安全な型キャスト

unknown型として出力されたPostgreSQLのJSONBやMySQLのJSON列は、ColumnType<UserMeta, string | UserMeta, string | UserMeta>のような独自のDTOインターフェースに置換することで、挿入時とクエリ時の双方で厳格な構造チェックを維持できます。

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

実行時クエリにおいてPostgreSQLのTIMESTAMPTZ型がDateではなく文字列として返却される

Kyselyの型定義はランタイムドライバの動作を反映します。pg.types.setTypeParser(1184, (val) => new Date(val))でパーサーを設定するか、ColumnType<Date, string | Date, string | Date>を使用してSELECT時のDate型とINSERT時のISO文字列の両方を許容してください。

columnCasingをcamelに設定した際、実行時に「column does not exist」エラーが発生する

columnCasingをcamelにするとインターフェースがcamelCaseで生成されます。Kyselyインスタンス生成時に必ずCamelCasePluginを登録してください(new Kysely({ plugins: [new CamelCasePlugin()] }))。登録しない場合、PostgreSQL等のDBにcamelCaseの識別子がそのまま送信され失敗します。

よくある質問 (FAQ)

Sql To Kyselyは独自のSQLスキーマやテーブル定義を外部サーバーに送信しますか?▼

いいえ。SQLパース、AST走査、方言分析、TypeScriptインターフェース生成のすべての処理は、ブラウザ内のクライアントサイドメモリ上で完結します。DDL文やテーブル構造、メタデータがネットワーク経由で送信されることはありません。

複合主キーは生成されるTypeScriptコード上でどのように表現されますか?▼

複数列のPRIMARY KEY制約から検出され、該当するテーブルインターフェース内で非NULL列として型付けされます。Kyselyは代理キーを必須としないため、db.selectFrom('table').where((eb) => eb.and([...]))などの複合フィルターを用いて安全にクエリ可能です。

PostgreSQLのカスタムENUM型やインラインCHECK制約はどのように型変換されますか?▼

PostgreSQLのCREATE TYPE ... AS ENUM文はエクスポートされたTypeScriptの文字列Union型(例: export type UserRole = 'admin' | 'user')に変換されます。値リストを含むインラインCHECK制約も同様に文字列リテラルのUnion型として抽出されます。

単一schemaモードとmultifileエクスポートモードの設計上の違いは何ですか?▼

schemaモードはすべてのテーブルインターフェースとルートDatabaseインターフェースを1つのdatabase.tsに集約し、小規模プロジェクトに最適です。multifileモードは各エンティティをtables/配下の個別ファイルに分割しindex.tsで集約するため、大規模なチーム開発でのマージコンフリクトを防ぎます。

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

すべてのツール →
SQL DDL から MikroORM TypeScript エンティティ変換ジェネレーター開発ツール

SQL CREATE TABLE 定義を解析し、@Entity、@PrimaryKey、@Property、@Index、およびリレーション装飾子を備えた MikroORM エンティティクラスに変換します。

ツールを開く→
JSONからMongooseスキーマ&TypeScriptモデル生成ツール開発ツール

JSONペイロードからMongoDB Mongooseスキーマ、TypeScript型定義(Document・DTO)、ネストされたサブドキュメント、タイムスタンプを推論・自動生成します。

ツールを開く→
JSON to Yup バリデーションスキーマ生成ツール開発ツール

JSONサンプルを型安全なYupオブジェクト検証スキーマに変換し、yup.string()、yup.number()、yup.array()、必須ルールを自動生成します。

ツールを開く→
JSON から Joi オブジェクト検証スキーマ自動生成ガイド開発ツール

サンプル JSON データ構造から Joi.object()、Joi.string()、Joi.number()、Joi.array() などの制約を備えた Joi バリデーションスキーマを瞬時に自動生成します。

ツールを開く→
JSON から Apache Avro スキーマ (.avsc) 変換ツール開発ツール

JSONペイロードから、名前空間、プリミティブ型、論理型、null許容共用体型、スキーマ進化ルールを備えた本番仕様のApache Avroスキーマ(.avsc)定義を生成します。

ツールを開く→
GraphQL SDL to Zod バリデーションスキーマ生成開発ツール

GraphQL SDL の型定義、クエリ、入力を、Null 許容性を適切に制御したランタイム Zod バリデーションスキーマ(z.object、z.string、z.array)へ自動変換します。

ツールを開く→