SQL a Drizzle

Generador de esquemas Drizzle ORM desde SQL DDL (PostgreSQL, MySQL, SQLite)

Convierte sentencias SQL CREATE TABLE en esquemas fuertemente tipados de Drizzle ORM con definiciones pgTable, mysqlTable y sqliteTable.

Ajustes preestablecidos:
Dialecto de base de datos:
Sintaxis del esquema:
Claves de columnas:
Sentencias 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);
Tablas analizadas5Modelos de esquema diferenciados
Columnas convertidas34Atributos de tabla tipados
Claves foráneasPostgreSQL
4Referencias y enlaces relacionales

Privacidad local sin subidas

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

Precisión multi-dialecto para Drizzle

Compatibilidad total con pgTable (PostgreSQL), mysqlTable (MySQL) y sqliteTable (SQLite), con mapeos precisos de tipos, enums, índices y restricciones.

Relaciones e inferencias con seguridad de tipos

Genera relations() tipadas de Drizzle ORM, tipos $inferSelect, $inferInsert y esquemas de validación opcionales drizzle-zod listos para producción.

Referencia técnica y guía de arquitectura

Generador de Esquemas SQL DDL a Drizzle ORM (PostgreSQL, MySQL, SQLite) - Guía de Desarrollador — Guía de referencia

Convierte sentencias SQL CREATE TABLE en esquemas fuertemente tipados de Drizzle ORM con definiciones pgTable, mysqlTable y sqliteTable.

Parámetros clave y controles

Dialecto de Base de Datos (Target Dialect)Enum ('postgresql' | 'mysql' | 'sqlite')

Especifica el dialecto de base de datos de destino y los paquetes centrales de Drizzle correspondientes (drizzle-orm/pg-core, drizzle-orm/mysql-core o drizzle-orm/sqlite-core).

Por defecto: postgresql
Convención de Nombres de Columnas (Column Casing)Enum ('camelCase' | 'snake_case')

Determina si las claves de las propiedades en TypeScript se transforman a camelCase idiomático o conservan el snake_case de la base de datos.

Por defecto: camelCase
Generar Inferencia de Tipos ($inferSelect / $inferInsert)Boolean

Genera automáticamente las declaraciones de tipos de TypeScript correspondientes (typeof table.$inferSelect y typeof table.$inferInsert) para cada tabla.

Por defecto: true
Modo de Exportación (Export Syntax)Enum ('named' | 'schema-object')

Permite elegir entre exportar constantes nombradas individuales (export const users = ...) o agrupar todas las definiciones en un objeto contenedor.

Por defecto: named

Consejos profesionales y mejores prácticas

Las cláusulas REFERENCES se traducen

Las cláusulas REFERENCES se traducen automáticamente a funciones de flecha .references(() => targetTable.id), previniendo errores de orden de evaluación en tiempo de ejecución.

Soporte de pgEnum para PostgreSQL

Las declaraciones CREATE TYPE ... AS ENUM de Postgres se extraen como definiciones independientes de pgEnum(), manteniendo la seguridad de tipos de unión en TypeScript.

Las claves primarias compuestas y los

Las claves primarias compuestas y los índices multicolumna se estructuran dentro del tercer argumento callback de la tabla: (table) => [...].

Errores comunes y solución de problemas

Error de sintaxis por directivas propietarias del motor SQL

Elimine cláusulas específicas como ENGINE=InnoDB o directivas de tablespace antes de procesar sentencias estándar CREATE TABLE.

Referencias circulares entre tablas que generan errores en TypeScript

Utilice la sintaxis de callback diferido .references(() => otherTable.id) recomendada por Drizzle o separe las relaciones en bloques relations() independientes.

Preguntas frecuentes (FAQ)

¿Cómo se gestionan las claves primarias y campos autoincrementables?▼

En PostgreSQL, SERIAL y BIGSERIAL se asignan a serial() y bigserial(). En MySQL, AUTO_INCREMENT se convierte en .autoincrement(), y en SQLite INTEGER PRIMARY KEY se mapea a integer().primaryKey({ autoIncrement: true }).

¿El esquema generado es compatible directamente con drizzle-kit push y generate?▼

Sí, el código TypeScript generado cumple al 100% las convenciones oficiales de Drizzle ORM y es totalmente compatible con las migraciones e introspección de drizzle-kit.

¿Cómo se interpretan las restricciones de nulidad y valores por defecto?▼

Las columnas sin NOT NULL son nulables por defecto. Las columnas NOT NULL reciben el encadenamiento .notNull(), y las cláusulas DEFAULT se convierten en .default(...) o $defaultFn().

¿Se envía algún dato SQL o estructura de base de datos a servidores externos?▼

No. El análisis léxico, el parseo de DDL y la generación de código TypeScript se ejecutan enteramente en el navegador del cliente sin ninguna llamada de red externa.

Herramientas y utilidades relacionadas

Todas las herramientas →
Guía del Desarrollador: Generador de Esquemas Valibot desde JSON (Validación Modular TypeScript)Desarrollo

Transforme datos JSON en definiciones de esquemas Valibot ligeras y con soporte de tree-shaking mediante v.object, v.string, v.number y validadores de arrays.

Abrir herramienta→
Generador de esquemas JSON a TypeBox (Proveedor de tipos JSON Schema rápido)Desarrollo

Convierta estructuras JSON en definiciones TypeBox Type.Object de alto rendimiento para validación en tiempo de ejecución en Fastify, Ajv y TypeScript.

Abrir herramienta→
Generador de Migración Prisma Schema a SQL DDLDesarrollo

Guía técnica para convertir esquemas de Prisma a sentencias SQL DDL compatibles con PostgreSQL, MySQL y SQLite.

Abrir herramienta→
Guía de Desarrollo: Generador de Interfaces y Tipos TypeScript desde Prisma SchemaDesarrollo

Extrae modelos, enums, campos opcionales y relaciones de Prisma Schema en interfaces TypeScript independientes sin depender del runtime de Prisma Client.

Abrir herramienta→
Guía de Desarrollo: Generador de Clientes API Axios TypeScript desde OpenAPI y SwaggerDesarrollo

Genere funciones de cliente HTTP Axios e interfaces de parámetros con seguridad de tipos estricta a partir de especificaciones OpenAPI 3.0 y Swagger JSON/YAML.

Abrir herramienta→
Guía del Desarrollador del Generador de Clientes TypeScript con Fetch Nativo desde OpenAPI y SwaggerDesarrollo

Genere métodos de API en TypeScript con fetch nativo sin dependencias, serialización de consultas, cabeceras y tipos de respuesta.

Abrir herramienta→