SQL para Drizzle

Gerador de esquemas Drizzle ORM a partir de SQL DDL (PostgreSQL, MySQL, SQLite)

Converta instruções SQL CREATE TABLE em esquemas fortemente tipados do Drizzle ORM com definições pgTable, mysqlTable e sqliteTable.

Modelos:
Dialeto do banco de dados:
Sintaxe do esquema:
Chaves de colunas:
Instruções 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);
Tabelas analisadas5Modelos de esquema distintos
Colunas convertidas34Atributos de tabela tipados
Chaves estrangeirasPostgreSQL
4Referências e vínculos relacionais

Privacidade local sem upload

Toda a análise de SQL e a síntese de esquemas TypeScript são executadas 100% no sandbox do seu navegador local. A arquitetura do seu banco de dados nunca sai da sua máquina.

Precisão multi-dialeto para Drizzle

Suporte completo para pgTable (PostgreSQL), mysqlTable (MySQL) e sqliteTable (SQLite) com mapeamentos precisos de tipos, enums, índices e restrições.

Relações e inferências fortemente tipadas

Gera relations() tipadas do Drizzle ORM, tipos $inferSelect, $inferInsert e esquemas de validação opcionais drizzle-zod prontos para produção.

Referência técnica e guia de arquitetura

Gerador de Esquemas SQL DDL para Drizzle ORM (PostgreSQL, MySQL, SQLite) — Guia de referência

Converta instruções SQL CREATE TABLE em esquemas fortemente tipados do Drizzle ORM com definições pgTable, mysqlTable e sqliteTable.

Parâmetros principais e controles

Dialeto do Banco de Dados (Target Dialect)Enum ('postgresql' | 'mysql' | 'sqlite')

Define o dialeto de banco de dados do Drizzle e as bibliotecas de importação correspondentes (drizzle-orm/pg-core, drizzle-orm/mysql-core ou drizzle-orm/sqlite-core).

Padrão: postgresql
Convenção de Nomes de Coluna (Column Casing)Enum ('camelCase' | 'snake_case')

Controla se as propriedades do esquema no TypeScript são convertidas para camelCase idiomático ou mantêm o snake_case original do banco.

Padrão: camelCase
Gerar Inferência de Tipos ($inferSelect / $inferInsert)Boolean

Inclui declarações de tipos tipadas no TypeScript (typeof table.$inferSelect e typeof table.$inferInsert) para cada tabela gerada.

Padrão: true
Sintaxe de Exportação (Export Syntax)Enum ('named' | 'schema-object')

Especifica se as tabelas devem ser exportadas como constantes nomeadas individuais ou encapsuladas em um único objeto de esquema.

Padrão: named

Dicas profissionais e melhores práticas

Cláusulas REFERENCES do SQL são

Cláusulas REFERENCES do SQL são transformadas automaticamente em callbacks .references(() => otherTable.id), prevenindo problemas com referências circulares.

Extração de pgEnum no PostgreSQL

Declarações CREATE TYPE ... AS ENUM do Postgres são extraídas como chamadas pgEnum(), preservando a segurança de união de tipos no TypeScript.

Chaves Primárias Compostas e Índices

Chaves primárias compostas e índices com múltiplas colunas são organizados dentro do terceiro parâmetro de função da tabela: (table) => [...].

Problemas comuns e solução de problemas

Erros causados por sintaxe proprietária ou procedimentos armazenados

Remova cláusulas específicas de armazenamento como ENGINE=InnoDB ou definições de triggers antes de inserir as instruções CREATE TABLE.

Dependências circulares de chaves estrangeiras no TypeScript

Adote a sintaxe de função seta .references(() => targetTable.id) recomendada pelo Drizzle ou separe os relacionamentos no módulo relations().

Perguntas frequentes (FAQ)

Como o gerador trata chaves primárias e sequências auto-incrementáveis?▼

No PostgreSQL, SERIAL e BIGSERIAL são mapeados para serial() e bigserial(). No MySQL, AUTO_INCREMENT torna-se .autoincrement(), e no SQLite INTEGER PRIMARY KEY mapeia para integer().primaryKey({ autoIncrement: true }).

Os esquemas gerados são 100% compatíveis com drizzle-kit?▼

Sim. O código TypeScript gerado segue rigorosamente o padrão do Drizzle ORM e funciona perfeitamente com drizzle-kit push, generate e Drizzle Studio.

Como campos anuláveis e valores padrão são convertidos?▼

Colunas sem a especificação NOT NULL permanecem anuláveis por padrão. Colunas NOT NULL recebem .notNull(), e cláusulas DEFAULT são convertidas para .default(...) ou $defaultFn().

Algum dado ou instrução SQL é enviado para servidores externos?▼

Não. A análise sintática do SQL e a geração de código TypeScript são processadas inteiramente no lado do cliente no navegador com total privacidade.

Ferramentas e utilitários relacionados

Todas as ferramentas →
Guia do Desenvolvedor: Gerador de Schemas Valibot a partir de JSON (Validação Modular TypeScript)Desenvolvimento

Converta dados JSON em esquemas Valibot leves e compatíveis com tree-shaking utilizando v.object, v.string, v.number e validadores de array.

Abrir ferramenta→
Gerador de Esquema JSON para TypeBox (Provedor rápido de tipos JSON Schema)Desenvolvimento

Converta estruturas JSON em definições TypeBox Type.Object de alta performance para Fastify, Ajv e validação em tempo de execução com TypeScript.

Abrir ferramenta→
Gerador de Migração Prisma Schema para SQL DDLDesenvolvimento

Guia técnico para converter esquemas Prisma em migrações SQL DDL para PostgreSQL, MySQL e SQLite.

Abrir ferramenta→
Guia do Desenvolvedor: Gerador de Interfaces e Tipos TypeScript a partir do Prisma SchemaDesenvolvimento

Extraia modelos, enums, campos opcionais e relações do esquema Prisma em interfaces TypeScript puras sem necessidade do runtime do Prisma Client.

Abrir ferramenta→
Guia do Desenvolvedor: Gerador de Clientes API Axios TypeScript a partir de OpenAPI e SwaggerDesenvolvimento

Gere funções de cliente HTTP Axios limpas e com segurança de tipos rigorosa a partir de especificações OpenAPI 3.0 e Swagger JSON/YAML.

Abrir ferramenta→
Guia do Desenvolvedor: Gerador de Cliente TypeScript com Fetch Nativo a partir de OpenAPI e SwaggerDesenvolvimento

Gere clientes de API em TypeScript com fetch nativo sem dependências externas, serialização de query string, cabeçalhos e tipagem completa.

Abrir ferramenta→