SQL a Kysely

Generador de Interfaces TypeScript Kysely desde SQL DDL

Manual técnico y generador de tipos para transformar esquemas DDL de SQL en interfaces TypeScript seguras para Kysely en PostgreSQL, MySQL y SQLite.

Ajustes:
Dialecto de Base de Datos:
Estilo de Interfaces:
Estilo de Columnas:
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>;
Tablas Procesadas4Entidades independientes
Columnas Convertidas38Atributos tipados
Relaciones y ClavesPostgreSQL
4Restricciones primarias y foráneas

Privacidad Local Sin Subidas

Todo el análisis de SQL y la síntesis de interfaces TypeScript se ejecutan al 100% en el navegador. La estructura de su base de datos nunca sale de su equipo.

Precisión de Tipos en Kysely

Mapea con exactitud los tipos SQL a TypeScript, envolviendo autoincrementos y valores predeterminados en Generated<T> y usando ColumnType.

Selectable, Insertable y Updateable

Genera la interfaz principal Database y los tipos auxiliares Selectable<T>, Insertable<T> y Updateable<T> listos para el query builder de Kysely.

Referencia técnica y guía de arquitectura

Referencia de Desarrollador Sql To Kysely — Guía de referencia

Manual técnico y generador de tipos para transformar esquemas DDL de SQL en interfaces TypeScript seguras para Kysely en PostgreSQL, MySQL y SQLite.

Parámetros clave y controles

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

Motor de base de datos SQL de destino que controla la traducción de tipos de datos específicos del dialecto y restricciones.

Por defecto: 'postgres'
variableCasing'pascal' | 'snake' | 'raw'

Estrategia de nomenclatura aplicada a las interfaces de tabla TypeScript generadas y tipos de modelo exportados.

Por defecto: 'pascal'
columnCasing'raw' | 'camel'

Estrategia de transformación de nombres de columnas para coincidir con el esquema SQL nativo o con CamelCasePlugin de Kysely.

Por defecto: 'raw'
outputTab'schema' | 'multifile' | 'relations' | 'config'

Estructura del código generado: archivo único database.ts, exportación modular multiactivo, tipos de relaciones o configuración del cliente.

Por defecto: 'schema'

Consejos profesionales y mejores prácticas

Uso de Generated en Columnas PK

Mapee columnas autoincrementales, seriales y con valores predeterminados a Generated<T> o ColumnType<Select, Insert, Update> de Kysely. Esto garantiza que TypeScript las requiera en SELECT pero las mantenga opcionales en INSERT.

Soporte para Plugin CamelCase

Al usar columnCasing en 'camel', configure new Kysely({ plugins: [new CamelCasePlugin()] }) en tiempo de ejecución. De lo contrario, Kysely enviará nombres en camelCase a motores SQL que esperan snake_case, provocando errores de columna inexistente.

Mapeo Estricto de Tipos JSONB

En columnas PostgreSQL JSONB o MySQL JSON tipadas inicialmente como unknown, sobreescriba la interfaz con DTOs personalizados mediante ColumnType<UserMeta, string | UserMeta, string | UserMeta> para mantener una validación de esquema estricta.

Errores comunes y solución de problemas

PostgreSQL TIMESTAMPTZ se serializa como cadena en lugar de Date en consultas de tiempo de ejecución

Kysely refleja el comportamiento del controlador subyacente. Configure pg.types.setTypeParser(1184, (val) => new Date(val)) o defina la columna como ColumnType<Date, string | Date, string | Date> para admitir instancias de Date al consultar y cadenas ISO al insertar.

Error 'column does not exist' en tiempo de ejecución al consultar con columnCasing configurado en camel

Si columnCasing está en camel, Kysely genera propiedades en camelCase. Debe registrar CamelCasePlugin al inicializar la instancia de Kysely (new Kysely({ plugins: [new CamelCasePlugin()] })); de lo contrario, las consultas enviarán identificadores en camelCase directamente a la base de datos SQL.

Preguntas frecuentes (FAQ)

¿Transmite Sql To Kysely esquemas SQL propietarios o definiciones de tablas a servidores externos?▼

No. Todo el análisis de SQL, recorrido de AST, detección de dialectos y generación de interfaces TypeScript se ejecutan estrictamente en la memoria del navegador del lado del cliente. No se transmiten sentencias DDL ni metadatas a través de la red.

¿Cómo se estructuran las claves primarias compuestas en la salida TypeScript generada?▼

Las claves primarias compuestas se detectan a partir de restricciones PRIMARY KEY multicolumna y se asignan como campos no nulos en la interfaz de tabla. Kysely no requiere identificadores sintéticos y permite consultas compuestas mediante db.selectFrom('table').where((eb) => eb.and([...])).

¿Cómo maneja el generador los tipos ENUM personalizados de PostgreSQL y las restricciones CHECK en línea?▼

Las sentencias CREATE TYPE ... AS ENUM de PostgreSQL se transforman en tipos de unión de cadenas en TypeScript (por ejemplo, export type UserRole = 'admin' | 'user'). Las restricciones CHECK con listas de valores también se mapean a uniones literales estrictas.

¿Qué diferencias arquitectónicas existen entre los modos de exportación schema y multifile?▼

El modo schema consolida todas las interfaces de tabla y la interfaz principal Database en un único archivo database.ts, ideal para proyectos compactos. El modo multifile divide cada entidad en su propio módulo dentro de tables/ y las exporta mediante index.ts, previniendo conflictos de fusión en equipos grandes.

Herramientas y utilidades relacionadas

Todas las herramientas →
Guía del Desarrollador del Generador de Entidades MikroORM TypeScript desde SQL DDLDesarrollo

Convierte definiciones SQL CREATE TABLE en clases de entidad MikroORM con decoradores @Entity, @PrimaryKey, @Property, @Index y relaciones.

Abrir herramienta→
Guía de Desarrollo: Generador de Esquemas Mongoose y Modelos TypeScript desde JSONDesarrollo

Infiere y genera esquemas MongoDB Mongoose, interfaces Document de TypeScript, subdocumentos anidados, marcas de tiempo y exportación de modelos desde JSON.

Abrir herramienta→
Guía para Desarrolladores del Generador de Esquemas de Validación Yup desde JSONDesarrollo

Transforme muestras JSON en esquemas de validación de objetos Yup con seguridad de tipos, yup.string(), yup.number(), yup.array() y reglas requeridas.

Abrir herramienta→
Guía de Desarrollo: Generador de Esquemas de Validación Joi desde JSONDesarrollo

Transforme estructuras de datos JSON en esquemas de validación de Joi con reglas Joi.object(), Joi.string(), Joi.number() y Joi.array().

Abrir herramienta→
Guía para Desarrolladores del Conversor de JSON a Esquema Apache Avro (.avsc)Desarrollo

Convierta cargas útiles JSON en definiciones de esquema Apache Avro (.avsc) para producción con espacios de nombres, tipos primitivos y lógicos, uniones que admiten nulos y reglas de evolución.

Abrir herramienta→
Guía para Desarrolladores: Generador de Esquemas de Validación Zod desde GraphQL SDLDesarrollo

Convierta tipos, consultas y entradas de GraphQL SDL en esquemas de validación Zod en tiempo de ejecución (z.object, z.string, z.array) con soporte exhaustivo de nulabilidad.

Abrir herramienta→