SQL zu Kysely

SQL DDL zu Kysely TypeScript Database Interface Generator

Autoritative Referenz zur Konvertierung von SQL-DDL-Schemas in typsichere Kysely-TypeScript-Definitionen für PostgreSQL-, MySQL- und SQLite-Dialekte.

Voreinstellungen:
Ziel-Datenbankdialekt:
Interface-Schreibweise:
Spalten-Schreibweise:
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>;
Tabellen analysiert4Unabhängige Schemamodelle
Spalten konvertiert38Typisierte Schemaattribute
Relationen & SchlüsselPostgreSQL
4Primär- und Fremdschlüssel

Vollständige lokale Privatsphäre

Alle SQL-Parser- und TypeScript-Generierungsprozesse laufen zu 100% lokal in Ihrer Browser-Sandbox. Keine Daten verlassen Ihren Rechner.

Präzise Kysely-Typsicherheit

Präzises Mapping von SQL-Typen auf TypeScript, einschließlich Generated<T> für Auto-Inkremente und Defaults sowie ColumnType für asymmetrische Spalten.

Selectable, Insertable & Updateable

Erstellt standardmäßig die zentrale Database-Schnittstelle sowie Selectable<T>, Insertable<T> und Updateable<T> Hilfstypen für Kysely.

Technische Referenz & Architektur-Leitfaden

Sql To Kysely Entwickler-Referenz — Referenz-Leitfaden

Autoritative Referenz zur Konvertierung von SQL-DDL-Schemas in typsichere Kysely-TypeScript-Definitionen für PostgreSQL-, MySQL- und SQLite-Dialekte.

Wichtige Parameter & Steuerelemente

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

Ziel-SQL-Datenbank-Engine zur Steuerung der dialektspezifischen Datentyptranslation und Constraint-Syntax.

Standard: 'postgres'
variableCasing'pascal' | 'snake' | 'raw'

Benennungsstrategie für generierte TypeScript-Tabelleninterfaces und exportierte Modell-Typbezeichner.

Standard: 'pascal'
columnCasing'raw' | 'camel'

Transformationsstrategie für Tabellenspaltennamen zur Abstimmung auf natives SQL oder das Kysely CamelCasePlugin.

Standard: 'raw'
outputTab'schema' | 'multifile' | 'relations' | 'config'

Struktur des generierten Codes: wahlweise konsolidierte database.ts, modulare Mehrdatei-Exporte, Relationstypen oder Client-Konfiguration.

Standard: 'schema'

Profi-Tipps & Best Practices

Automatische Generated-Typen

Spalten mit Auto-Inkrement, SERIAL oder Default-Werten sollten mit Kyselys Generated<T> oder ColumnType<Select, Insert, Update> typisiert werden. Dies stellt sicher, dass Felder bei SELECT vorhanden sind, aber bei INSERT-Operationen optional bleiben.

CamelCase-Plugin-Abstimmung

Wird columnCasing auf 'camel' gesetzt, muss Kysely zur Laufzeit mit new Kysely({ plugins: [new CamelCasePlugin()] }) initialisiert werden. Ohne dieses Plugin sendet Kysely CamelCase-Bezeichner unmaskiert an die Datenbank, was zu Spaltenfehlern führt.

Dialektspezifische JSONB-Typen

Ersetzen Sie standardmäßig generierte unknown-Typen für PostgreSQL-JSONB oder MySQL-JSON-Spalten durch benutzerdefinierte DTOs via ColumnType<UserMeta, string | UserMeta, string | UserMeta>, um vollständige statische Typsicherheit bei Inserts und Abfragen zu gewährleisten.

Häufige Fallstricke & Fehlerbehebung

PostgreSQL TIMESTAMPTZ wird bei Laufzeitabfragen als String statt als Date-Objekt serialisiert

Kysely bildet das Verhalten des Treibers ab. Konfigurieren Sie pg.types.setTypeParser(1184, (val) => new Date(val)) oder überschreiben Sie die Spalte mit ColumnType<Date, string | Date, string | Date>, um Date-Objekte beim Select und ISO-Strings beim Insert zu unterstützen.

Laufzeitfehler 'column does not exist' bei Abfragen mit auf camel gesetztem columnCasing

Wenn columnCasing auf camel gesetzt ist, generiert Kysely camelCase-Eigenschaften. Sie müssen beim Initialisieren der Kysely-Instanz das CamelCasePlugin registrieren (new Kysely({ plugins: [new CamelCasePlugin()] })), da die Abfragen andernfalls camelCase-Bezeichner ungemappt an die SQL-Datenbank senden.

Häufig gestellte Fragen (FAQ)

Überträgt Sql To Kysely proprietäre SQL-Schemas oder Tabellendefinitionen an externe Server?▼

Nein. Sämtliches SQL-Parsing, AST-Traversierung, Dialektanalysen und die TypeScript-Interface-Generierung erfolgen vollständig im clientseitigen Arbeitsspeicher Ihres Browsers. Es werden keine DDL-Anweisungen oder Schemadaten über das Netzwerk übertragen.

Wie werden zusammengesetzte Primärschlüssel in der generierten TypeScript-Ausgabe abgebildet?▼

Zusammengesetzte Primärschlüssel werden anhand mehrspaltiger PRIMARY KEY-Constraints erkannt und im entsprechenden Tabelleninterface als nicht-nullable Spalten typisiert. Kysely unterstützt mehrteilige Schlüssel nativ über Bedingungen wie db.selectFrom('table').where((eb) => eb.and([...])).

Wie verarbeitet der Generator benutzerdefinierte PostgreSQL-ENUM-Typen und Inline-CHECK-Constraints?▼

PostgreSQL-Anweisungen des Typs CREATE TYPE ... AS ENUM werden in exportierte TypeScript-String-Union-Typen (z. B. export type UserRole = 'admin' | 'user') konvertiert. Auch Inline-CHECK-Constraints mit Wertelisten werden als strikte String-Literal-Unions abgebildet.

Welche architektonischen Unterschiede bestehen zwischen dem Schema- und dem Multifile-Exportmodus?▼

Der Schema-Modus bündelt alle Tabelleninterfaces, Typ-Aliase und das zentrale Database-Interface in einer einzigen database.ts für schnelles Setup. Der Multifile-Modus trennt jede Entität in eine eigene Datei unter tables/ und aggregiert sie via index.ts, was Merge-Konflikte in großen Teams minimiert.

Verwandte Werkzeuge & Dienstprogramme

Alle Werkzeuge →