Formate SQL e organize consultas online
Transforme uma consulta SQL compacta ou com estilo inconsistente em uma versão legível, com palavras-chave em maiúsculas, espaços previsíveis e recuo estruturado.
Executar grátis
O formatador faz uma análise léxica determinística, preservando strings e identificadores entre aspas enquanto deixa cláusulas e expressões aninhadas mais fáceis de examinar. Ele também verifica a estrutura antes de produzir a saída: parênteses sem par, valores entre aspas incompletos e identificadores delimitados sem fechamento são rejeitados. Você pode usar a ferramenta diretamente no navegador ou automatizar o mesmo comportamento pela API por US$ 0,002 a cada solicitação.
O que o formatador altera e preserva
O formatador converte palavras-chave SQL reconhecidas para maiúsculas e coloca cláusulas importantes, como SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING, LIMIT e junções comuns, em linhas fáceis de acompanhar. Vírgulas separam os itens das listas, enquanto parênteses acrescentam um nível de recuo a expressões aninhadas e subconsultas. Os operadores recebem espaços uniformes. Ao mesmo tempo, todo conteúdo delimitado é tratado como protegido. Textos entre aspas simples, identificadores entre aspas duplas ou crases e identificadores entre colchetes mantêm seus caracteres e sua capitalização original. Comentários de linha e de bloco também permanecem na saída. Dessa forma, a consulta fica mais simples de revisar sem pressupor nada sobre o esquema do banco. A formatação é intencionalmente determinística: entradas iguais produzem saídas iguais, sem rede, interpretação de modelo, escolha aleatória ou dependência do ambiente. O resultado é devolvido no campo formatted_sql como texto simples, pronto para ser copiado para um editor, uma migração, um relatório ou uma revisão de código.
Como a validação estrutural protege o resultado
Uma saída bonita não ajuda quando esconde uma consulta incompleta. Por isso, a validação ocorre durante a tokenização, antes da organização visual. Cada parêntese de abertura precisa ter o fechamento correspondente, e um fechamento não pode surgir antes da abertura. Strings entre aspas simples, identificadores entre aspas duplas, crases e colchetes devem terminar corretamente. Caracteres de aspas duplicados dentro de um valor são reconhecidos como escapes, permitindo representar um apóstrofo com duas aspas simples, como é comum em SQL. Escapes com barra invertida também permanecem unidos quando aparecem. Um comentário de bloco sem encerramento é recusado porque o restante não pode ser formatado com segurança. Essas verificações são estruturais, não semânticas: a ferramenta não se conecta ao banco, não confere nomes de tabelas ou colunas, não escolhe um dialeto e não determina se a instrução será executada. Uma consulta equilibrada ainda pode conter sintaxe específica inválida. Portanto, a mensagem identifica parênteses ou aspas desequilibrados como entrada inválida sem alegar uma compilação SQL completa.
Como usar SQL formatado em um fluxo confiável
Cole a consulta inteira no campo query e envie o valor como string. No uso interativo, compare a versão formatada com a original antes de substituir código de produção, especialmente quando a instrução contém operadores específicos de um fornecedor ou regras incomuns de delimitação. Em automações, rode o formatador antes de armazenar migrações geradas, anexar SQL a tarefas de revisão ou comparar mudanças em consultas. Um layout consistente reduz ruído nos diffs: a equipe pode se concentrar em junções, condições, colunas selecionadas e ordenação, em vez de discutir letras maiúsculas e espaços. Como comentários e valores delimitados são preservados, a saída atende tanto à documentação quanto à execução, mas a formatação nunca substitui a validação e os testes do banco. A ferramenta no navegador executa a mesma função pura da API, mantendo os resultados alinhados. A API custa US$ 0,002 por solicitação. A entrada é processada sem serviços externos e não precisa ser retida após a resposta. Se houver erro, corrija o delimitador sem par e envie novamente a instrução completa.
Casos de uso
Organizar SQL gerado
Converta uma consulta de uma linha criada por ORM, log ou ferramenta de relatórios em um layout mais fácil de inspecionar e discutir.
Padronizar revisões de migração
Aplique capitalização e recuo previsíveis antes da revisão para reduzir diferenças que tratam apenas de formatação.
Detectar consultas coladas incompletas
Recuse SQL copiado sem uma aspa ou um parêntese antes de publicá-lo em documentos ou repassá-lo a outro sistema.
Perguntas frequentes
O formatador executa o SQL?
Não. Ele faz apenas formatação léxica local e verificações estruturais. Não se conecta a um banco de dados nem consulta um esquema.
Como ele trata letras maiúsculas?
As palavras-chave SQL reconhecidas são convertidas para maiúsculas. Textos e identificadores delimitados mantêm a capitalização original.
Quais elementos são validados?
São recusados parênteses sem par, aspas simples ou duplas sem fechamento, identificadores incompletos entre crases ou colchetes e comentários de bloco não terminados.
A ferramenta aceita todos os dialetos SQL?
Ela formata a sintaxe SQL comum sem escolher um dialeto. Construções específicas de fornecedores são preservadas, mas sua semântica não é certificada.
Quanto custa a API?
A API custa US$ 0,002 por solicitação. A versão do navegador executa a mesma lógica de formatação determinística.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/web/sql-format \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"select u.id,u.name,count(o.id) as orders from users u left join orders o on o.user_id=u.id where u.active=true group by u.id,u.name order by orders desc;"}'const res = await fetch("https://api.kit.forhosting.com/web/sql-format", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"query": "select u.id,u.name,count(o.id) as orders from users u left join orders o on o.user_id=u.id where u.active=true group by u.id,u.name order by orders desc;"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/sql-format",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"query": "select u.id,u.name,count(o.id) as orders from users u left join orders o on o.user_id=u.id where u.active=true group by u.id,u.name order by orders desc;"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/sql-format", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"query":"select u.id,u.name,count(o.id) as orders from users u left join orders o on o.user_id=u.id where u.active=true group by u.id,u.name order by orders desc;"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"query":"select u.id,u.name,count(o.id) as orders from users u left join orders o on o.user_id=u.id where u.active=true group by u.id,u.name order by orders desc;"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/sql-format", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"query": "select u.id,u.name,count(o.id) as orders from users u left join orders o on o.user_id=u.id where u.active=true group by u.id,u.name order by orders desc;"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.sql_format",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
timeout_sec | 30 |
max_crawl_pages | 25 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |