SQL vers Kysely

Générateur d'Interfaces TypeScript Kysely depuis SQL DDL

Manuel technique de référence et générateur de schémas pour convertir des définitions SQL DDL en interfaces TypeScript Kysely robustes pour PostgreSQL, MySQL et SQLite.

Préréglages :
Dialecte SQL Cible:
Casse des Interfaces:
Casse des Colonnes:
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>;
Tables Analysées4Modèles indépendants
Colonnes Converties38Attributs typés
Relations & ClésPostgreSQL
4Clés primaires et étrangères

Confidentialité Locale Zéro-Upload

Toute l'analyse SQL et la génération des interfaces TypeScript s'exécutent à 100% dans le bac à sable de votre navigateur. Vos données ne quittent jamais votre machine.

Précision du Typage Kysely

Mappage rigoureux des types SQL vers TypeScript, encapsulant les auto-incréments et valeurs par défaut dans Generated<T> et les colonnes JSON dans ColumnType.

Selectable, Insertable & Updateable

Génère l'interface principale Database et les types utilitaires Selectable<T>, Insertable<T> et Updateable<T> prêts pour le query builder Kysely.

Référence technique et guide d'architecture

Référence Développeur Sql To Kysely — Guide de référence

Manuel technique de référence et générateur de schémas pour convertir des définitions SQL DDL en interfaces TypeScript Kysely robustes pour PostgreSQL, MySQL et SQLite.

Paramètres clés et contrôles

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

Moteur de base de données SQL cible contrôlant la traduction des types de données spécifiques au dialecte et des contraintes.

Par défaut : 'postgres'
variableCasing'pascal' | 'snake' | 'raw'

Stratégie de casse appliquée aux interfaces de table TypeScript générées et aux identifiants de modèles exportés.

Par défaut : 'pascal'
columnCasing'raw' | 'camel'

Stratégie de transformation des noms de colonnes pour correspondre au schéma SQL natif ou au plugin CamelCase de Kysely.

Par défaut : 'raw'
outputTab'schema' | 'multifile' | 'relations' | 'config'

Structure du code généré : fichier unique database.ts, export modulaire multifichier, types de relations ou configuration du client.

Par défaut : 'schema'

Conseils de pro et bonnes practices

Utilisation du Type Generated

Associez les colonnes auto-incrémentées, séries ou avec valeur par défaut à Generated<T> ou ColumnType<Select, Insert, Update>. Cela garantit que TypeScript les rend obligatoires en SELECT tout en les laissant optionnelles lors des requêtes INSERT.

Support du Plugin CamelCase

Lorsque columnCasing est configuré sur 'camel', déclarez new Kysely({ plugins: [new CamelCasePlugin()] }) dans votre configuration applicative. Sans ce plugin d'exécution, Kysely transmet les identifiants camelCase directement au moteur SQL.

Typage Dialecte pour JSONB

Pour les colonnes PostgreSQL JSONB ou MySQL JSON typées unknown par défaut, surchargez l'interface avec vos DTOs métier via ColumnType<UserMeta, string | UserMeta, string | UserMeta> afin de garantir un contrôle de type strict.

Pièges courants et dépannage

PostgreSQL TIMESTAMPTZ est sérialisé en chaîne de caractères au lieu d'un objet Date à l'exécution

Kysely reflète le comportement du pilote runtime. Configurez pg.types.setTypeParser(1184, (val) => new Date(val)) ou surchargez la colonne avec ColumnType<Date, string | Date, string | Date> pour accepter les objets Date en lecture et les chaînes ISO en insertion.

Erreur runtime 'column does not exist' lors des requêtes avec columnCasing configuré sur camel

Si columnCasing est défini sur camel, Kysely génère des clés en camelCase. Vous devez enregistrer CamelCasePlugin lors de l'instanciation de Kysely (new Kysely({ plugins: [new CamelCasePlugin()] })), sans quoi les requêtes enverront des noms camelCase directement au moteur SQL.

Foire aux questions (FAQ)

Sql To Kysely transmet-il des schémas SQL propriétaires ou des définitions de tables à des serveurs distants ?▼

Non. Tout le parsing SQL, le parcours d'AST, l'analyse des dialectes et la génération d'interfaces TypeScript s'exécutent strictement en mémoire dans le navigateur côté client. Aucune instruction DDL ni métadonnée n'est transmise sur le réseau.

Comment les clés primaires composites sont-elles structurées dans la sortie TypeScript générée ?▼

Les clés primaires composites sont extraites des contraintes PRIMARY KEY multicolonnes et définies comme champs non nullables dans l'interface de table. Kysely ne requiert aucune clé artificielle et permet le filtrage composé via db.selectFrom('table').where((eb) => eb.and([...])).

Comment le générateur gère-t-il les types ENUM personnalisés de PostgreSQL et les contraintes CHECK inline ?▼

Les instructions CREATE TYPE ... AS ENUM de PostgreSQL sont converties en types d'union de chaînes TypeScript exportés (ex. export type UserRole = 'admin' | 'user'). Les contraintes CHECK contenant des listes de valeurs sont également extraites sous forme d'unions de littéraux stricts.

Quelles différences architecturales existent entre les modes d'exportation schema et multifile ?▼

Le mode schema regroupe toutes les interfaces de table et l'interface Database racine dans un fichier database.ts unique pour une configuration rapide. Le mode multifile sépare chaque entité dans son propre module sous un dossier tables/ et les réexporte via index.ts, évitant ainsi les conflits de fusion en équipe.

Outils et utilitaires connexes

Tous les outils →
Guide du Développeur du Générateur d'Entités MikroORM TypeScript depuis SQL DDLDéveloppement

Convertissez les instructions SQL CREATE TABLE en classes d'entité MikroORM avec @Entity, @PrimaryKey, @Property, @Index et relations.

Ouvrir l'outil→
Guide Développeur : Générateur de Schémas Mongoose et Modèles TypeScript depuis JSONDéveloppement

Infère et génère des schémas MongoDB Mongoose, interfaces Document TypeScript, sous-documents imbriqués, horodatages et modèles exportables depuis du JSON.

Ouvrir l'outil→
Guide Développeur du Générateur de Schémas de Validation Yup depuis JSONDéveloppement

Transformez des exemples JSON en schémas de validation d'objets Yup typés avec yup.string(), yup.number(), yup.array() et règles requises.

Ouvrir l'outil→
Guide Développeur : Générateur de Schémas de Validation Joi depuis JSONDéveloppement

Convertissez des structures de données JSON en schémas de validation Joi robustes avec les contraintes Joi.object(), Joi.string(), Joi.number() et Joi.array().

Ouvrir l'outil→
Guide Développeur du Convertisseur JSON vers Schéma Apache Avro (.avsc)Développement

Convertissez des charges utiles JSON en schémas Apache Avro (.avsc) prêts pour la production, avec gestion des espaces de noms, types primitifs et logiques, champs union avec null et règles d'évolution.

Ouvrir l'outil→
Guide Développeur : Générateur de Schémas de Validation Zod depuis GraphQL SDLDéveloppement

Convertissez les types, requêtes et inputs GraphQL SDL en schémas de validation Zod à l'exécution (z.object, z.string, z.array) avec prise en charge avancée de la nullabilité.

Ouvrir l'outil→