Formateador de SQL para MySQL

Pega una consulta de MySQL —incluida una copiada directamente de los logs de la aplicación con los marcadores ? todavía dentro— y obtén SQL legible y formateado de forma consistente. Los identificadores entre comillas invertidas y las funciones propias de MySQL se conservan.

Una consulta MySQL, antes y después

La consulta sin formato de abajo es el ejemplo cargado en el editor de arriba, y la salida es exactamente lo que devuelve este formateador con las opciones por defecto. No se ha retocado nada a mano.

Pegado
SELECT `u`.`id`, `u`.`name`, count(o.id) AS orders, sum(o.total) AS revenue FROM `users` `u` LEFT JOIN `orders` `o` ON o.user_id = u.id WHERE u.created_at >= ? AND u.status = ? AND o.region IN (?) GROUP BY u.id, u.name HAVING sum(o.total) > ? ORDER BY revenue DESC LIMIT 50
Salida formateada
SELECT
  `u`.`id`,
  `u`.`name`,
  count(o.id) AS orders,
  sum(o.total) AS revenue
FROM
  `users` `u`
  LEFT JOIN `orders` `o` ON o.user_id = u.id
WHERE
  u.created_at >= ?
  AND u.status = ?
  AND o.region IN (?)
GROUP BY
  u.id,
  u.name
HAVING
  sum(o.total) > ?
ORDER BY
  revenue DESC
LIMIT
  50

Sintaxis de MySQL que soporta

Un formateador genérico destroza la sintaxis propia del dialecto o la rechaza directamente. Estas son las construcciones de MySQL contra las que se prueba este formateador.

?

Los marcadores posicionales se agrupan por la columna y el operador con los que van, así que una columna comparada dos veces se rellena una sola vez.

`identifier`

Los identificadores entre comillas invertidas conservan sus comillas y sus mayúsculas.

ON DUPLICATE KEY UPDATE

Las cláusulas de sentencia exclusivas de MySQL se formatean en lugar de pasar como un bloque opaco.

STRAIGHT_JOIN

Las pistas de join y de índice de MySQL se conservan en su sitio.

Preguntas frecuentes del formateador de MySQL

¿Puedo pegar una consulta con marcadores ? directamente desde mis logs?

Sí. Ese es el caso habitual. Los marcadores ? se detectan y se agrupan por la columna con la que se comparan, así que una columna repetida se rellena una vez. Después puedes cambiar la salida a SQL con valores para obtener una consulta ejecutable.

¿Funciona también para MariaDB?

Sí: elige MariaDB en la lista de dialectos para las palabras clave propias de MariaDB, o usa MySQL, que cubre la sintaxis compartida.

¿Conserva las mayúsculas de los identificadores entre acentos graves?

Sí. El formato de las palabras clave y el de los identificadores son opciones separadas, así que puedes poner SELECT y JOIN en mayúsculas mientras una columna como userProfile mantiene su camelCase. En MySQL eso importa más que en otros motores, porque la sensibilidad a mayúsculas de los nombres de tabla depende del sistema de archivos del servidor.

¿Puede minificar una consulta de MySQL a una línea?

Sí. La minificación compacta la consulta para volver a pegarla en el código de la aplicación, y nunca reescribe los espacios dentro de un literal de cadena: una comparación contra un valor con dos espacios sigue devolviendo las mismas filas después de minificar.

¿Formatea un fragmento sacado de una línea de log?

Sí. Una consulta parcial —o un simple WHERE u.created_at >= ? AND u.status = ?— se formatea y se puede editar sin el SELECT que la rodea. Esa es la forma habitual de la salida del slow query log y del log general de MySQL, así que es justo el caso para el que está pensado este formateador.

¿Se manejan ON DUPLICATE KEY UPDATE y las pistas de índice?

Sí. Las cláusulas exclusivas de MySQL se formatean como cláusulas reales en lugar de pasar como un bloque sin formato, y las pistas de join o de índice como STRAIGHT_JOIN y FORCE INDEX siguen pegadas a la tabla a la que califican.