SQL para Zod
Modelagem de esquema e segurança de tipos

SQL CREATE TABLE DDL to Zod Schema Converter

Converta esquemas de tabelas SQL, tipos de dados, restrições e colunas anuláveis em esquemas de objetos Zod estritamente tipados em TypeScript.

Predefinições:
Opções do compilador SQL para Zod e regras de tipos
postgres•nullable•camel
Entrada(4 tabelas)
import { z } from 'zod';

// ============================================================================
// Enums
// ============================================================================

userRoleSchema = z.enum(['SUPERADMIN', 'ORG_ADMIN', 'MEMBER', 'BILLING', 'GUEST']);
UserRole = z.infer<typeof userRoleSchema>;

subscriptionStatusSchema = z.enum(['TRIALING', 'ACTIVE', 'PAST_DUE', 'CANCELED']);
SubscriptionStatus = z.infer<typeof subscriptionStatusSchema>;

// ============================================================================
// Table: organizations
// ============================================================================
organizationsSchema = z.object({
  id: z.string().uuid(),
  slug: z.string().max(64),
  name: z.string().max(255),
  billingEmail: z.string().email().max(255),
  status: subscriptionStatusSchema,
  settings: z.record(z.string(), z.unknown()).nullable(),
  isActive: z.boolean(),
  createdAt: z.coerce.date(),
  updatedAt: z.coerce.date(),
});

Organization = z.infer<typeof organizationsSchema>;

// ============================================================================
// Table: users
// ============================================================================
usersSchema = z.object({
  id: z.string().uuid(),
  organizationId: z.string().uuid(),
  email: z.string().email().max(255),
  fullName: z.string().max(120).nullable(),
  avatarUrl: z.string().url().max(500).nullable(),
  role: userRoleSchema,
  phoneNumber: z.string().max(32).nullable(),
  isVerified: z.boolean(),
  lastLoginAt: z.coerce.date().nullable(),
  createdAt: z.coerce.date(),
});

User = z.infer<typeof usersSchema>;

// ============================================================================
// Table: api_keys
// ============================================================================
apiKeysSchema = z.object({
  id: z.coerce.number().int().positive(),
  organizationId: z.string().uuid(),
  userId: z.string().uuid().nullable(),
  keyPrefix: z.string().max(12),
  hashedSecret: z.string().max(128),
  scopes: z.record(z.string(), z.unknown()),
  expiresAt: z.coerce.date().nullable(),
  revokedAt: z.coerce.date().nullable(),
  createdAt: z.coerce.date(),
});

ApiKey = z.infer<typeof apiKeysSchema>;

// ============================================================================
// Table: audit_logs
// ============================================================================
auditLogsSchema = z.object({
  id: z.coerce.number().int().positive(),
  organizationId: z.string().uuid(),
  actorId: z.string().uuid().nullable(),
  eventName: z.string().max(100),
  ipAddress: z.string().ip().nullable(),
  userAgent: z.string().max(500).nullable(),
  payload: z.record(z.string(), z.unknown()).nullable(),
  createdAt: z.coerce.date(),
});

AuditLog = z.infer<typeof auditLogsSchema>;
Parsed Tables4 schemas ready
Columns Mapped36 campos tipados
Zod Schemas14 validadores inferidos

Execução Local Zero-Knowledge

Todo o processamento, análise e geração de código ocorrem estritamente na memória do seu navegador. Zero uploads para servidores externos.

Motor Reativo de Submilissegundos

All data payloads remain strictly local with zero external server communication.

Production Ready Export

Clean, optimized output formats ready for immediate deployment.

Referência técnica e guia de arquitetura

Guia do Desenvolvedor do Conversor de SQL CREATE TABLE DDL para Esquema Zod — Guia de referência

Converta esquemas de tabelas SQL, tipos de dados, restrições e colunas anuláveis em esquemas de objetos Zod estritamente tipados em TypeScript.

Parâmetros principais e controles

Dialeto SQLEnum (PostgreSQL | MySQL | SQLite | SQL Server | MariaDB)

Especifica o dialeto SQL de destino para interpretar tipos de dados específicos (como SERIAL, VARCHAR, DATETIME2, JSONB), delimitadores de identificadores e cláusulas de restrição.

Padrão: PostgreSQL
Estratégia de NulabilidadeEnum (strict-nullable | nullish | optional-defaults)

Define como as cláusulas SQL NULL e DEFAULT são traduzidas para modificadores Zod: .nullable() estrito, .nullish() (aceita null ou undefined), ou .optional() para campos com valores padrão ou chaves autoincrementais.

Padrão: strict-nullable
Modo de Coerção de TiposBoolean

Envolve validações primitivas com z.coerce (como z.coerce.number(), z.coerce.date(), z.coerce.boolean()) para converter automaticamente strings recebidas de formulários ou parâmetros de URL.

Padrão: false
Formato de Destino de DatasEnum (Date Instance (z.date()) | ISO String (z.string().datetime()) | Coerced Date (z.coerce.date()))

Determina como os tipos TIMESTAMP, DATE e DATETIME do SQL são validados: como instâncias nativas de Date do JavaScript, strings ISO 8601 ou datas com coerção automática.

Padrão: Date Instance (z.date())
Gerar Tipos InferidosBoolean

Gera automaticamente definições de tipo TypeScript exportadas através de z.infer<typeof schema> para operações de leitura (select) e inserção (insert).

Padrão: true

Dicas profissionais e melhores práticas

Em bancos de dados relacionais

Em bancos de dados relacionais, chaves primárias com AUTO_INCREMENT ou SERIAL e colunas com DEFAULT são preenchidas automaticamente. Crie um esquema base e derive um esquema de inserção utilizando .omit({ id: true, createdAt: true }) ou tornando colunas geradas como .optional().

Declarações SQL DDL costumam tipar

Declarações SQL DDL costumam tipar campos semiestruturados genericamente como JSON ou JSONB, gerando z.record(z.any()) ou z.unknown(). Substitua-os por esquemas Zod aninhados específicos para assegurar tipagem estrita de ponta a ponta.

O tipo Number padrão do JavaScript

O tipo Number padrão do JavaScript perde precisão acima de 2^53 - 1. Ao converter colunas SQL BIGINT ou NUMERIC / DECIMAL, mapeie identificadores para z.bigint() ou z.string() e quantias financeiras para strings validadas por regex (ex: z.string().regex(/^\d+\.\d{2}$/)).

Caso seu banco de dados utilize o

Caso seu banco de dados utilize o padrão snake_case e sua base TypeScript adote camelCase, utilize transformações do Zod (.transform((data) => ({ ... }))) ou pipelines (.pipe()) para normalizar os nomes dos campos em tempo de execução sem alterar a estrutura SQL.

Problemas comuns e solução de problemas

ZodError: Expected date, received string ao validar requisições JSON ou corpos de API

Cargas JSON enviam datas no formato de string ISO 8601, falhando na validação direta com z.date(). Altere o Formato de Destino de Datas para 'ISO String (z.string().datetime())' ou ative o Modo de Coerção de Tipos (z.coerce.date()) para instanciar objetos Date automaticamente.

Tipos ENUM do PostgreSQL ou domínios personalizados causam erros no analisador

Certifique-se de incluir instruções CREATE TYPE ou restrições CHECK de coluna no DDL fornecido. O conversor converterá enums do PostgreSQL e cláusulas CHECK (col IN (...)) diretamente para declarações z.enum([...]).

Chaves primárias autoincrementais falham na validação de inserção

Colunas SERIAL ou IDENTITY são NOT NULL no banco de dados, mas não são enviadas pelo cliente ao criar registros. Defina a Estratégia de Nulabilidade como 'optional-defaults' ou derive um esquema de inserção com .omit({ id: true }).

Perguntas frequentes (FAQ)

Como o conversor traduz a nulabilidade de colunas SQL para modificadores Zod?▼

Colunas sem restrição NOT NULL são anuláveis no SQL e recebem o modificador .nullable() no Zod. Colunas com cláusula DEFAULT ou autoincremento podem ser configuradas como .optional() ou .nullish() (aceitando null e undefined) para atender aos padrões de envio de dados em APIs.

Qual é a diferença entre z.date(), z.coerce.date() e z.string().datetime()?▼

z.date() exige que o valor já seja uma instância do objeto Date do JavaScript (comum em retornos de ORMs como Drizzle ou Prisma). z.string().datetime() valida se o texto está no padrão ISO 8601 sem transformá-lo. z.coerce.date() aceita strings, timestamps e datas, executando new Date(val) durante a validação.

Os esquemas Zod gerados podem ser usados com ORMs como Drizzle, Prisma ou Kysely?▼

Sim, com total compatibilidade. Os esquemas gerados são ideais para a validação em tempo de execução em rotas de API, Server Actions ou middlewares antes de os dados validados serem enviados para execução no seu ORM.

Meus comandos SQL DDL são enviados para servidores externos ou nuvem?▼

Não. Todo o processo de tokenização SQL, árvore sintática abstrata (AST) e geração de código TypeScript ocorre 100% no navegador do cliente através de Web Workers. Nenhuma informação de tabela ou esquema sai do seu dispositivo.

Como são tratadas restrições CHECK e chaves estrangeiras?▼

Restrições CHECK que delimitam listas de valores (ex: CHECK (status IN ('active', 'inactive'))) são mapeadas para z.enum(). Restrições de intervalos numéricos são traduzidas em regras como .min() e .max(). Colunas de chave estrangeira mantêm o tipo escalar correspondente, como z.string().uuid() ou z.number().int().

Ferramentas e utilitários relacionados

Todas as ferramentas →