sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo verificar las declaraciones (My) SQL para la corrección sintáctica?

Después de buscar una herramienta CLI para el deslinte de sintaxis en Mysql para usar en Jenkins y no encontré nada rápidamente (esta pregunta de Stackoverflow es uno de los primeros resultados - LOL) se me ocurrió la siguiente solución (SO:Linux, pero debería ser factible con Windows también):

Algo como lo siguiente:

lint_result=`mysql mysql_test -B -f -e 'select asdf s where x;' 2>&1`; if [ `echo $lint_result | sed -r "s/ERROR ([0-9]*).*/\1/g"` -eq 1064 ]; then echo -e "Syntax error:\n${lint_result}"; fi
Syntax error:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where x' at line 1

(Para verificar archivos sql puede usar "

Si mysql no puede analizar la sintaxis de la consulta, afirma:ERROR 1064 (42000) en la línea 1:Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de '' en la línea 1

Solo si la sintaxis es correcta, intenta ejecutar la consulta y se da cuenta de que la tabla no existe, pero esto ya no es interesante:

ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist

Por lo tanto, el error 1064 es una sintaxis no válida. Solo necesita crear una base de datos de prueba vacía porque, de lo contrario, solo aparecerán errores con una parte FROM incorrecta (aquí, por ejemplo, se necesita la base de datos para obtener un resultado de verificación de sintaxis válido:'select asdf from s where x and if;).

Por lo que he probado, funciona bien (Versión Mysql 5.5).

Aquí una versión completa del script bash:

#!/bin/bash

source_dir=${1};
database="mysql_test";
mysql_args="-h127.0.0.1";

mysql $mysql_args -B -e "DROP DATABASE IF EXISTS $database; CREATE DATABASE $database;";
for file in `find $source_dir -name "*.sql"`; do
    lint_result=`mysql $mysql_args $database -f -b < $file 2>&1`;
    if [ "`echo $lint_result | sed -r \"s/ERROR ([0-9]*).*/\1/g\"`" = "1064" ]; then
        echo -e "Syntax error in file ${file}:\n${lint_result}" && exit 1;
    fi;
done