banco de dados agentes IA · 2026-07-11

Banco de Dados com Agentes de IA: Models, Migrations e SQL com Claude Code e Codex

Guia completo de banco de dados agentes IA. Aprenda a criar models, migrations e consultas SQL complexas usando Claude Code, Codex e outros agentes de IA no Windows.

Modelar um banco de dados exige precisão: definir tipos certos, índices corretos, relacionamentos que não travem a aplicação. Escrever migrations seguras demanda atenção a cada ALTER TABLE. Montar consultas SQL complexas — com joins, subqueries, CTEs — consome horas de idas e vindas entre documentação e terminal. Usar banco de dados agentes IA transforma esse processo: em vez de você escrever cada linha de SQL, você orienta agentes como Claude Code e Codex para criar, evoluir e consultar seu banco com velocidade e consistência.

Neste guia prático, você vai aprender a usar agentes de IA para modelar esquemas relacionais, gerar migrations seguras, construir consultas complexas e otimizar performance — tudo rodando no Windows, com exemplos prontos para PostgreSQL e SQLite.

Sumário

  1. O cenário: banco de dados com agentes IA ainda é gargalo no desenvolvimento
  2. Models com Claude Code — modelagem relacional assistida
  3. Migrations com Codex — evolução segura do esquema
  4. Consultas complexas com agentes — joins, CTEs e subqueries
  5. Otimização de performance com agentes de IA
  6. Integração do banco com a API da aplicação
  7. FAQ — Perguntas Frequentes
  8. Comece a modelar bancos com agentes hoje

O cenário: banco de dados com agentes IA ainda é gargalo no desenvolvimento

Quando você desenvolve com agentes de IA, o ciclo é rápido: descreve uma feature, o agente gera o código, você revisa e testa. Mas em algum momento você precisa de um banco de dados — e aí o ritmo desacelera. Modelar entidades, definir relacionamentos, escrever migrations e criar consultas analíticas são tarefas que exigem conhecimento específico de SQL e do SGBD escolhido.

O problema é que, sem um banco bem modelado, o resto da aplicação sofre. Uma migration mal escrita derruba dados em produção. Uma query N+1, que parece inocente, derruba a API em escala. Um model sem índices corretos transforma consultas de milissegundos em minutos.

Banco de dados com agentes IA resolve isso colocando o conhecimento de SQL no bolso do desenvolvedor. Você não precisa decorar a sintaxe de window functions ou lembrar o nome de todas as constraints — o agente sabe. Seu papel muda para orientador: você descreve o que precisa, revisa o que foi gerado e toma as decisões de arquitetura.

Neste tutorial, usamos PostgreSQL como banco principal (compatível com SQLite para testes locais). Todos os exemplos rodam no Windows via PowerShell ou WSL 2, com Claude Code (Anthropic) e Codex (OpenAI). Os mesmos comandos funcionam com qualquer LLM compatível com terminal.

Imagem sugerida: Diagrama de visão geral mostrando o fluxo: desenvolvedor descreve requisitos em linguagem natural -> Claude Code/Codex -> SQL gerado (models, migrations, queries) -> banco de dados PostgreSQL.

Models com Claude Code — modelagem relacional assistida

A base de qualquer aplicação com banco de dados são os models — a representação das entidades do domínio em tabelas, colunas, tipos e relacionamentos. Com Claude Code models, você descreve o domínio em linguagem natural e recebe o DDL completo.

Exemplo: modelando um sistema de tarefas

Vamos supor que você está construindo um sistema de gerenciamento de tarefas com usuários, projetos e comentários. Em vez de abrir um editor SQL e digitar cada CREATE TABLE manualmente, você pergunta ao Claude Code:

claude "Modele um banco PostgreSQL para um sistema de tarefas com as seguintes entidades: usuário (nome, email único, avatar), projeto (nome, descrição, dono), tarefa (título, descrição, status, prioridade, datas, responsável, projeto), comentário (conteúdo, autor, tarefa). Inclua timestamps, chaves estrangeiras, índices e constraints de unicidade. Gere o DDL completo."

O agente analisa o domínio e devolve algo como:

-- Usuários CREATE TABLE usuarios ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), nome VARCHAR(150) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, avatar_url TEXT, criado_em TIMESTAMPTZ NOT NULL DEFAULT now(), atualizado_em TIMESTAMPTZ NOT NULL DEFAULT now() ); -- Projetos CREATE TABLE projetos ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), nome VARCHAR(200) NOT NULL, descricao TEXT, dono_id UUID NOT NULL REFERENCES usuarios(id), criado_em TIMESTAMPTZ NOT NULL DEFAULT now(), atualizado_em TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_projetos_dono ON projetos(dono_id); -- Tarefas CREATE TYPE status_tarefa AS ENUM ('pendente', 'em_andamento', 'concluida', 'cancelada'); CREATE TYPE prioridade_tarefa AS ENUM ('baixa', 'media', 'alta', 'urgente'); CREATE TABLE tarefas ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), titulo VARCHAR(300) NOT NULL, descricao TEXT, status status_tarefa NOT NULL DEFAULT 'pendente', prioridade prioridade_tarefa NOT NULL DEFAULT 'media', data_limite DATE, responsavel_id UUID REFERENCES usuarios(id), projeto_id UUID NOT NULL REFERENCES projetos(id) ON DELETE CASCADE, criado_em TIMESTAMPTZ NOT NULL DEFAULT now(), atualizado_em TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_tarefas_projeto ON tarefas(projeto_id); CREATE INDEX idx_tarefas_responsavel ON tarefas(responsavel_id); CREATE INDEX idx_tarefas_status ON tarefas(status); -- Comentários CREATE TABLE comentarios ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), conteudo TEXT NOT NULL, autor_id UUID NOT NULL REFERENCES usuarios(id), tarefa_id UUID NOT NULL REFERENCES tarefas(id) ON DELETE CASCADE, criado_em TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_comentarios_tarefa ON comentarios(tarefa_id);

Perceba os detalhes que o Claude Code acertou sozinho: uso de UUID como chave primária (evita exposição de sequenciais em APIs REST), ENUMs para status e prioridade (tipagem forte), timestamps com TIMESTAMPTZ (fuso horário), índices em todas as chaves estrangeiras e ON DELETE CASCADE onde faz sentido.

Refinando o model

O primeiro resultado raramente é o final. Você pode iterar com comandos adicionais:

claude "Adicione uma tabela de etiquetas (tags) com relacionamento muitos-para-muitos com tarefas. Inclua a tabela associativa e índices."

Com esse comando, o agente adiciona a tabela tags e a tabela tarefas_tags, com os índices compostos necessários. Você mantém o controle do que entra no esquema, mas o trabalho pesado de escrever SQL fica com o agente.

Imagem sugerida: Split-screen mostrando de um lado o prompt em linguagem natural no terminal do Claude Code e do outro o DDL gerado com destaque para os elementos críticos (PKs, FKs, indexes, enums).

Migrations com Codex — evolução segura do esquema

Modelar o banco é a primeira etapa. A segunda — e mais delicada — é evoluir o esquema sem quebrar dados existentes. Uma migration mal escrita pode travar uma tabela inteira em produção ou deletar colunas sem warning. É aqui que migrations agentes IA com Codex brilham.

Gerando a primeira migration

Com o banco modelado, você quer adicionar um campo de bio ao usuário e uma tabela de notificações. Em vez de escrever a migration manualmente, delegue ao Codex:

codex "Generate PostgreSQL migrations for two changes: 1. Add a 'bio' column (TEXT, nullable) to the 'usuarios' table 2. Create a 'notificacoes' table with: id (UUID PK), usuario_id (FK usuarios), tipo (VARCHAR 50), conteudo (TEXT), lida (BOOLEAN default false), criado_em (TIMESTAMPTZ) Use transactional migrations with rollback support."

O Codex gera migrations completas com transação e rollback:

-- 001_add_bio_to_usuarios.sql BEGIN; ALTER TABLE usuarios ADD COLUMN bio TEXT; COMMIT; -- Rollback: -- BEGIN; -- ALTER TABLE usuarios DROP COLUMN bio; -- COMMIT;
-- 002_create_notificacoes.sql BEGIN; CREATE TABLE notificacoes ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), usuario_id UUID NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE, tipo VARCHAR(50) NOT NULL, conteudo TEXT NOT NULL, lida BOOLEAN NOT NULL DEFAULT false, criado_em TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_notificacoes_usuario ON notificacoes(usuario_id); CREATE INDEX idx_notificacoes_lida ON notificacoes(usuario_id, lida); COMMIT; -- Rollback: -- BEGIN; -- DROP TABLE IF EXISTS notificacoes; -- COMMIT;

Migrations destrutivas com segurança

O verdadeiro valor do Codex em migrations está nos cenários mais complexos: renomear colunas, alterar tipos, remover constraints. São operações que exigem cuidado redobrado. Peça ao agente uma migration com verificação de existência:

codex "Write a PostgreSQL migration to rename the column 'tipo' to 'categoria' in the 'notificacoes' table. Include safety checks: only run the rename if the column 'tipo' exists and 'categoria' does not already exist. Generate both the up and down (rollback) migration."

O agente retorna:

BEGIN; DO $$ BEGIN IF EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'notificacoes' AND column_name = 'tipo' ) AND NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'notificacoes' AND column_name = 'categoria' ) THEN ALTER TABLE notificacoes RENAME COLUMN tipo TO categoria; END IF; END $$; COMMIT; -- Rollback: -- BEGIN; -- ALTER TABLE notificacoes RENAME COLUMN categoria TO tipo; -- COMMIT;

Esse nível de segurança é difícil de manter quando se escreve migrations manualmente sob pressão. Com o Codex, cada migration vem com guard-rails embutidos — basta pedir.

Migrations em lote com Claude Code

Para projetos maiores, peça ao Claude Code que lide com múltiplas alterações de uma vez:

claude "Gere uma migration PostgreSQL que: 1. Cria a tabela 'logs_auditoria' com id, tabela_afetada, operação, dados_antigos, dados_novos, usuario_id, criado_em 2. Adiciona uma coluna 'telefone' (VARCHAR 20) à tabela usuarios 3. Cria um índice único em projetos(nome, dono_id) 4. Adiciona uma constraint CHECK em tarefas garantindo que data_limite seja futura ou nula Cada alteração em uma transação separada com rollback individual."

Com banco dados Codex e Claude Code migrations, você mantém o esquema evoluindo em paralelo com o código da aplicação, sem acumular débito técnico de migrations feitas às pressas.

Imagem sugerida: Terminal mostrando a execução sequencial de migrations SQL com feedback de sucesso/erro para cada uma, estilo flyway ou migrate.

Consultas complexas com agentes — joins, CTEs e subqueries

Se models e migrations são a engenharia do banco, as consultas SQL são a alma da aplicação. Uma consulta bem escrita entrega dados precisos em milissegundos; uma mal escrita derruba performance e frustra usuários.

Com SQL agente inteligente, você descreve o que precisa em linguagem natural e recebe SQL otimizado, incluindo CTEs, window functions e joins complexos.

Consulta com agregação

claude "Escreva uma consulta PostgreSQL que retorne, para cada projeto: - Nome do projeto - Nome do dono - Total de tarefas - Tarefas concluídas - Percentual de conclusão - Média de dias para concluir uma tarefa - Nome do responsável com mais tarefas concluídas Ordene por percentual de conclusão decrescente."

O Claude Code gera uma consulta com CTE, JOIN múltiplo e window function:

WITH stats_tarefas AS ( SELECT t.projeto_id, COUNT(*) AS total_tarefas, COUNT(*) FILTER (WHERE t.status = 'concluida') AS concluidas, AVG(CASE WHEN t.status = 'concluida' THEN EXTRACT(DAY FROM (t.atualizado_em - t.criado_em)) END) AS dias_medio_conclusao FROM tarefas t GROUP BY t.projeto_id ), top_responsavel AS ( SELECT DISTINCT ON (t.projeto_id) t.projeto_id, u.nome AS responsavel_top FROM tarefas t JOIN usuarios u ON u.id = t.responsavel_id WHERE t.status = 'concluida' GROUP BY t.projeto_id, u.nome ORDER BY t.projeto_id, COUNT(*) DESC ) SELECT p.nome AS projeto, du.nome AS dono, s.total_tarefas, s.concluidas, ROUND( CASE WHEN s.total_tarefas > 0 THEN (s.concluidas::DECIMAL / s.total_tarefas) * 100 ELSE 0 END, 1 ) AS percentual_conclusao, ROUND(COALESCE(s.dias_medio_conclusao, 0), 1) AS dias_medio, COALESCE(tr.responsavel_top, 'N/D') AS responsavel_destaque FROM stats_tarefas s JOIN projetos p ON p.id = s.projeto_id JOIN usuarios du ON du.id = p.dono_id LEFT JOIN top_responsavel tr ON tr.projeto_id = p.id ORDER BY percentual_conclusao DESC;

Uma consulta que levaria 20-30 minutos para escrever e testar manualmente fica pronta em segundos. Você revisa a lógica, ajusta se necessário, e incorpora ao código.

Consultas analíticas com Codex

Para consultas com foco em relatórios e dashboards, o Codex tende a gerar SQL mais enxuto e direto:

codex "Write a PostgreSQL query that returns a monthly trend of task completion for the last 12 months. Show: year, month, total tasks created, total tasks completed, running total of completed tasks, and the month-over-month completion rate change. Use CTEs for clarity."
WITH tarefas_por_mes AS ( SELECT DATE_TRUNC('month', criado_em) AS mes, COUNT(*) AS criadas, COUNT(*) FILTER (WHERE status = 'concluida') AS concluidas FROM tarefas WHERE criado_em >= DATE_TRUNC('month', NOW()) - INTERVAL '12 months' GROUP BY DATE_TRUNC('month', criado_em) ) SELECT EXTRACT(YEAR FROM mes)::INT AS ano, EXTRACT(MONTH FROM mes)::INT AS mes_num, TO_CHAR(mes, 'Mon/YY') AS rotulo, criadas, concluidas, SUM(concluidas) OVER (ORDER BY mes) AS acumulado_concluidas, ROUND( (concluidas - LAG(concluidas) OVER (ORDER BY mes)) / NULLIF(LAG(concluidas) OVER (ORDER BY mes), 0)::DECIMAL * 100, 1 ) AS variacao_percentual FROM tarefas_por_mes ORDER BY mes;

Subqueries e otimização de relacionamentos

Outro cenário comum é detectar e corrigir o famoso problema N+1 — quando uma aplicação faz N consultas extras para carregar relacionamentos:

claude "Analise este ORM query e converta para SQL puro otimizado, eliminando o problema N+1: for usuario in usuarios: print(usuario.nome) for tarefa in usuario.tarefas: print(tarefa.titulo, tarefa.status) for comentario in tarefa.comentarios: print(comentario.conteudo)"

O agente reconhece o padrão N+1 e gera uma única query otimizada com JOINs:

SELECT u.nome AS usuario, t.titulo AS tarefa, t.status, c.conteudo AS comentario FROM usuarios u LEFT JOIN tarefas t ON t.responsavel_id = u.id LEFT JOIN comentarios c ON c.tarefa_id = t.id ORDER BY u.nome, t.titulo, c.criado_em;

Isso reduz de dezenas ou centenas de consultas para apenas uma — um ganho de performance imediato que, sem o agente, exigiria análise manual do perfil de queries da aplicação.

Imagem sugerida: Terminal PostgreSQL (\x auto) mostrando resultado de uma query complexa com múltiplas colunas agregadas, evidenciando a saída limpa e estruturada.

Otimização de performance com agentes de IA

Modelar e consultar é só metade do trabalho. Manter o banco rápido à medida que os dados crescem exige atenção constante a índices, planos de execução e gargalos. Performance banco agentes IA acelera essa análise.

Analisando EXPLAIN ANALYZE

Pegue o plano de execução de uma query lenta e passe para o Claude Code:

claude "Analise este EXPLAIN ANALYZE de uma query no PostgreSQL. Identifique: scans sequenciais, hash joins caros, estimativas erradas do planner. Sugira índices, rewrite da query ou mudanças de configuração: Seq Scan on tarefas (cost=0.00..18432.00 rows=85000 width=120) Filter: ((status)::text = 'pendente'::text)"

O agente responde com diagnóstico e ação:

Problema: Seq Scan em 'tarefas' com 85.000 linhas estimadas — full table scan. Solução: O índice idx_tarefas_status já existe, mas o filtro usa cast para text, o que pode inibir o uso do índice se a coluna for ENUM. Ação: 1. Verifique o tipo real da coluna: \d tarefas 2. Se o tipo for status_tarefa (ENUM), a query deve usar o tipo diretamente sem cast: status = 'pendente'::status_tarefa 3. Execute ANALYZE tarefas; para atualizar as estatísticas

Sugestão de índices compostos

codex "Analyze this slow query pattern and suggest indexes: SELECT * FROM tarefas WHERE projeto_id = $1 AND status = 'pendente' AND data_limite < NOW() ORDER BY prioridade DESC, criado_em ASC LIMIT 20"
Suggested index: CREATE INDEX idx_tarefas_projeto_status_data ON tarefas(projeto_id, status, data_limite DESC); This composite index covers the WHERE filter (projeto_id, status, date range) and the ORDER BY (prioridade DESC would need a separate index or INCLUDE clause).

Com Claude Code PostgreSQL e Codex banco dados, a otimização deixa de ser tarefa de DBA e passa a ser um diálogo contínuo entre você e o agente.

Imagem sugerida: Split-screen mostrando EXPLAIN ANALYZE de uma query antes (com Seq Scan destacada em vermelho) e depois da otimização (com Index Scan em verde), com as sugestões do agente ao lado.

Integração do banco com a API da aplicação

De nada adianta ter models perfeitos se a aplicação não consegue se conectar ao banco de forma eficiente. A integração entre banco e API é onde models, migrations e consultas se encontram no código real.

Gerando a camada de repositório

Com os models criados, peça ao Claude Code que gere a camada de acesso a dados:

claude "Com base no schema PostgreSQL que geramos (usuarios, projetos, tarefas, comentarios, tags), crie uma camada de repositório em TypeScript usando node-postgres. Inclua: 1. Funções CRUD para cada entidade 2. Uma função de busca de tarefas com filtros combinados (status, prioridade, projeto, responsavel, data_limite) 3. Paginação baseada em cursor (keyset pagination) 4. Tratamento de erros com tipos específicos 5. Pool de conexões configurável via variáveis de ambiente"

O agente gera o repositório completo, incluindo tipos TypeScript para cada entidade, funções com query parametrizada (protegida contra SQL injection) e padrão Repository.

Testando a integração

Com Codex, você pode gerar dados de teste e validar o fluxo completo:

codex "Generate a PostgreSQL script that inserts 5 users, 3 projects, 15 tasks, 8 comments and 4 tags with relations. Include realistic Portuguese names and content. Wrap everything in a single transaction with rollback on error."

Conexão segura com variáveis de ambiente

Ao finalizar a integração, configure o agente para revisar a segurança da conexão:

claude "Revise a string de conexão PostgreSQL neste código. Verifique: uso de SSL, pool de conexões, timeout, tratamento de falhas de conexão, exposição de credenciais."

O agente aponta vulnerabilidades como credenciais硬codadas, falta de SSL em produção e ausência de retry logic.

FAQ — Perguntas Frequentes

Claude Code consegue modelar bancos de dados relacionais do zero?

Sim. Com um prompt descritivo do domínio, Claude Code gera o DDL completo incluindo tipos, chaves estrangeiras, ENUMs, índices e constraints — pronto para executar em PostgreSQL, MySQL ou SQLite.

Codex é melhor para migrations ou para consultas?

Depende do perfil. Codex tende a gerar SQL mais conciso e estruturado, ideal para migrations com operações atômicas e rollback. Claude Code produz consultas analíticas mais ricas com CTEs e window functions. Na prática, os dois se complementam.

É seguro deixar o agente executar migrations em produção?

Não sem supervisão. Sempre revise a migration gerada antes de executar em produção. Use o agente para gerar o script, revise a lógica e execute manualmente ou via pipeline de CI/CD com validação automatizada.

O agente entende diferenças entre PostgreSQL, MySQL e SQLite?

Sim. Especifique o SGBD no prompt (ex.: "PostgreSQL 16", "MySQL 8", "SQLite 3"). O agente ajusta tipos, funções e sintaxe de acordo com o dialeto. Para projetos que rodam em múltiplos bancos, peça SQL compatível com ANSI.

Como evitar SQL injection no código gerado pelo agente?

Instrua o agente a usar sempre query parametrizada (placeholders $1, $2 no PostgreSQL, ? no MySQL). Peça explicitamente: "Use prepared statements em todas as queries." Revise o código gerado para confirmar que não há concatenação de strings em SQL.

Agentes de IA resolvem problemas N+1 automaticamente?

Sim, quando você descreve o padrão. Mostre o código com o loop aninhado e peça ao agente que converta para uma única query com JOINs. O agente identifica o problema N+1 e gera a versão otimizada.

Claude Code consegue modelar bancos de dados relacionais do zero?

Sim. Com um prompt descritivo do domínio — entidades, atributos, relacionamentos — Claude Code gera o DDL completo incluindo tipos, chaves estrangeiras, ENUMs, índices e constraints, pronto para executar em PostgreSQL, MySQL ou SQLite. O resultado poupa horas de consulta a documentação.

Codex é melhor para migrations ou para consultas?

Depende do perfil. Codex tende a gerar SQL mais conciso e estruturado, ideal para migrations com operações atômicas e rollback explícito. Claude Code produz consultas analíticas mais ricas, com CTEs, window functions e joins múltiplos. Na prática, usar os dois agentes alternadamente cobre todos os cenários de banco de dados.

É seguro deixar o agente executar migrations em produção?

Não sem supervisão. Sempre revise a migration gerada antes de executar em produção. Use o agente para gerar o script e validar a lógica, mas execute manualmente ou via pipeline de CI/CD com validação automatizada (testes, backups, rollback testado).

O agente entende diferenças entre PostgreSQL, MySQL e SQLite?

Sim. Especifique o SGBD no prompt (ex.: "PostgreSQL 16", "MySQL 8", "SQLite 3") e o agente ajusta tipos, funções e sintaxe de acordo com o dialeto. Para projetos que rodam em múltiplos bancos, peça SQL compatível com ANSI e o agente evita features específicas de cada SGBD.

Como evitar SQL injection no código gerado pelo agente?

Instrua o agente a usar sempre query parametrizada (placeholders $1, $2 no PostgreSQL, ? no MySQL). Peça explicitamente no prompt: "Use prepared statements em todas as queries." Na revisão, confirme que não há concatenação de strings em SQL — essa é a principal causa de injeção.

Agentes de IA resolvem problemas N+1 automaticamente?

Sim, quando você descreve o padrão. Mostre ao agente o código com o loop aninhado (ex.: for usuário in usuários: for tarefa in usuário.tarefas) e peça a conversão para uma única query com JOINs. O agente identifica o padrão N+1 e gera a versão otimizada automaticamente.

Comece a modelar bancos com agentes hoje

Criar e gerenciar bancos de dados com agentes de IA não é um conceito experimental — é uma prática que você pode adotar hoje. Comece com um modelo simples de duas ou três tabelas para sentir como o agente interpreta seu domínio. Depois evolua para migrations, consultas analíticas e otimização de performance.

O ganho não está apenas na velocidade. Está na consistência: cada model carrega boas práticas de índices, tipos e constraints; cada migration vem com rollback; cada consulta complexa é otimizada desde a primeira versão.

Quer usar Claude Code e Codex lado a lado enquanto modela seu banco de dados?

👉 Baixe o Orquestra para Windows 11 — gratuito por 7 dias, sem cartão de crédito.

👉 Veja os planos e preços para times que querem bancos de dados modelados com consistência e segurança.

Pronto para orquestrar seus agentes?

Baixe o Orquestra para Windows 11 e comece a coordenar seus agentes de IA em um canvas infinito. Grátis por 7 dias.