SQL vers Drizzle

Générateur de schémas Drizzle ORM à partir de SQL DDL (PostgreSQL, MySQL, SQLite)

Convertissez vos instructions SQL CREATE TABLE en schémas Drizzle ORM fortement typés avec des définitions pgTable, mysqlTable et sqliteTable.

Préréglages :
Dialecte de base de données:
Syntaxe du schéma:
Clés de colonnes:
Instructions SQL DDLPostgreSQL
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);
Tables analysées5Modèles de schéma distincts
Colonnes converties34Attributs de table typés
Clés étrangèresPostgreSQL
4Références et liens relationnels

Confidentialité locale sans téléversement

L'analyse SQL et la synthèse de schémas TypeScript s'exécutent à 100% dans le bac à sable de votre navigateur local. L'architecture de votre base de données ne quitte jamais votre machine.

Précision multi-dialecte Drizzle

Prise en charge complète de pgTable (PostgreSQL), mysqlTable (MySQL) et sqliteTable (SQLite) avec mappages précis des types, énumérations, index et contraintes.

Relations et inférences sécurisées par le typage

Génère des relations() typées Drizzle ORM, des types $inferSelect, $inferInsert et des schémas de validation drizzle-zod prêts pour la production.

Référence technique et guide d'architecture

Générateur de Schémas SQL DDL vers Drizzle ORM (PostgreSQL, MySQL, SQLite) - Guide Développeur — Guide de référence

Convertissez vos instructions SQL CREATE TABLE en schémas Drizzle ORM fortement typés avec des définitions pgTable, mysqlTable et sqliteTable.

Paramètres clés et contrôles

Dialecte de Base de Données (Target Dialect)Enum ('postgresql' | 'mysql' | 'sqlite')

Définit le dialecte cible de Drizzle ainsi que le package à importer (drizzle-orm/pg-core, drizzle-orm/mysql-core ou drizzle-orm/sqlite-core).

Par défaut : postgresql
Casse des Identifiants de Colonnes (Column Casing)Enum ('camelCase' | 'snake_case')

Contrôle si les clés des propriétés TypeScript sont converties en camelCase idiomatique ou conservent le snake_case de la base de données.

Par défaut : camelCase
Générer les Inférences de Types ($inferSelect / $inferInsert)Boolean

Ajoute automatiquement les types TypeScript fortement typés (typeof table.$inferSelect et typeof table.$inferInsert) pour chaque table.

Par défaut : true
Mode d'Exportation (Export Syntax)Enum ('named' | 'schema-object')

Permet d'exporter des constantes nommées individuelles (export const users = ...) ou de regrouper toutes les tables dans un conteneur d'export unique.

Par défaut : named

Conseils de pro et bonnes practices

Les contraintes REFERENCES sont

Les contraintes REFERENCES sont compilées en fonctions fléchées .references(() => otherTable.id), évitant ainsi les erreurs d'évaluation circulaire au runtime.

Support Natif de pgEnum pour PostgreSQL

Les instructions CREATE TYPE ... AS ENUM de Postgres sont extraites sous forme de définitions pgEnum() réutilisables avec inférence complète d'union TypeScript.

Les clés primaires composites et index

Les clés primaires composites et index multi-colonnes sont structurés dans le troisième argument callback de la table: (table) => [...].

Pièges courants et dépannage

Erreurs de syntaxe dues à des mots-clés propriétaires du SGBD

Supprimez les clauses spécifiques telles que ENGINE=InnoDB ou les triggers propriétaires avant de coller vos instructions standard CREATE TABLE.

Références circulaires entre tables provoquant des erreurs de typage

Utilisez la syntaxe de fonction fléchée paresseuse .references(() => targetTable.id) ou déclarez les relations via l'utilitaire relations() dans un fichier dédié.

Foire aux questions (FAQ)

Comment sont gérées les clés primaires et l'incrémentation automatique ?▼

Dans PostgreSQL, SERIAL et BIGSERIAL sont traduits en serial() et bigserial(). Dans MySQL, AUTO_INCREMENT devient .autoincrement(), et dans SQLite INTEGER PRIMARY KEY devient integer().primaryKey({ autoIncrement: true }).

Les schémas générés sont-ils compatibles avec les commandes de drizzle-kit ?▼

Oui, le code TypeScript produit respecte scrupuleusement les conventions de Drizzle ORM et fonctionne directement avec drizzle-kit push, generate et Drizzle Studio.

Comment la nullabilité et les valeurs par défaut sont-elles traduites ?▼

Les colonnes sans NOT NULL sont nullables par défaut dans Drizzle. Les colonnes NOT NULL reçoivent .notNull(), et les clauses DEFAULT sont converties en .default(...) ou $defaultFn().

Mes définitions SQL ou schémas sont-ils envoyés à un serveur distant ?▼

Non. Le découpage lexical SQL, l'analyse syntaxique et la génération du code Drizzle s'exécutent intégralement côté client dans votre navigateur sans aucune transmission réseau.

Outils et utilitaires connexes

Tous les outils →
Guide Développeur : Générateur de Schémas Valibot depuis JSON (Validation TypeScript Modulaire)Développement

Transformez vos données JSON en définitions de schémas Valibot légères et compatibles tree-shaking avec v.object, v.string, v.number et des validateurs de tableaux.

Ouvrir l'outil→
Générateur de Schémas JSON vers TypeBox - Guide DéveloppeurDéveloppement

Convertissez des structures JSON en définitions TypeBox Type.Object haute performance pour Fastify, Ajv et la validation TypeScript à l'exécution.

Ouvrir l'outil→
Générateur de Migration Prisma Schema vers SQL DDLDéveloppement

Guide technique pour convertir des schémas Prisma en scripts SQL DDL compatibles PostgreSQL, MySQL et SQLite.

Ouvrir l'outil→
Guide Développeur : Générateur d'Interfaces et Types TypeScript depuis Prisma SchemaDéveloppement

Extrayez les modèles, énumérations, champs optionnels et relations de votre schéma Prisma sous forme d'interfaces TypeScript autonomes sans dépendance au runtime Prisma Client.

Ouvrir l'outil→
Guide Développeur : Générateur de Client API Axios TypeScript depuis OpenAPI et SwaggerDéveloppement

Générez des fonctions de client HTTP Axios sécurisées et typées ainsi que des interfaces de paramètres à partir de spécifications OpenAPI 3.0 et Swagger JSON/YAML.

Ouvrir l'outil→
Guide Développeur du Générateur de Client TypeScript Fetch Natif depuis OpenAPI & SwaggerDéveloppement

Générez des clients d'API TypeScript en fetch natif sans dépendance externe, avec sérialisation des requêtes, en-têtes et typage complet.

Ouvrir l'outil→