Formatee SQL y presente consultas legibles en línea
Convierta una consulta SQL compacta o de estilo irregular en una versión legible, con palabras clave en mayúsculas, espacios previsibles y sangría estructurada.
Ejecutar — gratis
El formateador realiza un análisis léxico determinista, por lo que conserva las cadenas y los identificadores entre comillas mientras facilita la lectura de cláusulas y expresiones anidadas. También revisa la estructura antes de producir el resultado: rechaza paréntesis sin pareja, valores entre comillas incompletos e identificadores delimitados sin cierre. Puede usarlo directamente en el navegador o automatizar el mismo comportamiento mediante la API por $0.002 por solicitud.
Qué modifica y qué conserva el formateador
El formateador convierte a mayúsculas las palabras clave SQL reconocidas y sitúa en líneas claras las cláusulas principales, como SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING, LIMIT y las combinaciones habituales de JOIN. Las comas separan los elementos de una lista y los paréntesis añaden un nivel de sangría a expresiones anidadas y subconsultas. Los operadores reciben espacios uniformes. A la vez, el contenido delimitado se considera protegido: se conservan los caracteres y las mayúsculas originales de textos entre comillas simples, identificadores entre comillas dobles o acentos graves e identificadores entre corchetes. También permanecen los comentarios de línea y de bloque. Así, la consulta resulta más fácil de revisar sin suponer nada sobre el esquema de la base de datos. El proceso es determinista: la misma entrada siempre genera la misma salida, sin red, interpretación de modelos ni decisiones aleatorias. El campo formatted_sql devuelve texto sin formato que usted puede copiar a un editor, una migración, un informe o una revisión de código.
Cómo protege el resultado la validación estructural
Una presentación atractiva no sirve si oculta una consulta incompleta, por lo que la validación se realiza durante la tokenización y no después de aplicar el diseño. Cada paréntesis de apertura debe tener su cierre correspondiente, y ningún cierre puede aparecer antes que su apertura. Las cadenas entre comillas simples, los identificadores entre comillas dobles, los acentos graves y los corchetes deben terminar correctamente. El analizador reconoce como escapes los caracteres de comilla duplicados, lo que permite representar apóstrofos con dos comillas simples, una práctica habitual en SQL. También mantiene unidos los escapes con barra inversa cuando aparecen. Un comentario de bloque sin terminar se rechaza porque no es posible formatear el resto con seguridad. Estas comprobaciones son estructurales, no semánticas: la herramienta no se conecta a una base de datos, no verifica tablas o columnas, no elige un dialecto ni determina si la instrucción podrá ejecutarse. Una consulta equilibrada todavía puede contener sintaxis específica incorrecta. Por eso, el error se limita a identificar paréntesis o comillas desequilibrados como entrada no válida, sin afirmar que compila SQL por completo.
Cómo integrar SQL formateado en un flujo fiable
Pegue la consulta completa en el campo query y envíela como cadena. Para un uso interactivo, compare el resultado formateado con el original antes de sustituir código de producción, sobre todo si la instrucción utiliza operadores propios de un proveedor o reglas de comillas poco habituales. En automatizaciones, ejecute el formateador antes de guardar migraciones generadas, adjuntar SQL a incidencias de revisión o comparar cambios en consultas. Un diseño uniforme reduce diferencias irrelevantes: quien revisa puede centrarse en uniones, condiciones, columnas seleccionadas y ordenación, no en discutir mayúsculas y espacios. Como los comentarios y valores delimitados se conservan, el resultado sirve tanto para documentación como para ejecución, aunque el formato nunca sustituye la validación ni las pruebas de la base de datos. La herramienta del navegador usa la misma función pura que la API y mantiene ambos resultados alineados. La API cuesta $0.002 por solicitud. La entrada se procesa sin servicios externos y no necesita conservarse después de responder. Si falla la validación, corrija el delimitador sin pareja y vuelva a enviar la instrucción completa.
Qué puede hacer con ella
Ordenar SQL generado
Convierta una consulta de una sola línea procedente de un ORM, un registro o una herramienta de informes en una presentación fácil de inspeccionar.
Uniformar revisiones de migraciones
Aplique un uso previsible de mayúsculas y sangría antes de revisar una migración para reducir diferencias que solo afectan al estilo.
Detectar consultas pegadas incompletas
Rechace SQL copiado con una comilla o un paréntesis ausente antes de publicarlo o enviarlo a otro sistema.
Preguntas frecuentes
¿El formateador ejecuta el SQL?
No. Solo realiza formato léxico local y comprobaciones estructurales. No se conecta a una base de datos ni consulta un esquema.
¿Qué criterio usa para las mayúsculas?
Las palabras clave SQL reconocidas se convierten a mayúsculas. El texto y los identificadores delimitados conservan su capitalización original.
¿Qué elementos valida?
Rechaza paréntesis sin pareja, comillas simples o dobles sin cerrar, identificadores incompletos entre acentos graves o corchetes y comentarios de bloque sin terminar.
¿Admite todos los dialectos SQL?
Formatea la sintaxis SQL común sin seleccionar un dialecto. Conserva las construcciones específicas de cada proveedor, pero no certifica su semántica.
¿Cuánto cuesta la API?
La API cuesta $0.002 por solicitud. La versión del navegador ejecuta la misma lógica de formato determinista.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
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)Ejemplo de solicitud
{
"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;"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.sql_format",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
timeout_sec | 30 |
max_crawl_pages | 25 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |