Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso verificare la correttezza sintattica delle istruzioni (My)SQL

Dopo aver cercato uno strumento CLI per l'eliminazione della sintassi in Mysql da utilizzare in Jenkins e non ho trovato nulla rapidamente (questa domanda su Stackoverflow è uno dei primi risultati - LOL) ho trovato la seguente soluzione (SO:Linux, ma dovrebbe essere fattibile anche con Windows):

Qualcosa come il seguente:

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

(Per controllare i file sql puoi usare "

Se la sintassi della query non può essere analizzata da mysql, afferma:ERRORE 1064 (42000) alla riga 1:hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a '' alla riga 1

Solo se la sintassi è corretta prova ad eseguire la query e si rende conto che la tabella non esiste ma questo non è più interessante:

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

Pertanto l'errore 1064 è la sintassi non valida. Devi solo creare un database di test vuoto perché altrimenti apparirebbero solo errori con una parte FROM errata (qui ad esempio il database è necessario per ottenere un risultato del controllo della sintassi valido:'select asdf from s where x e if;).

Per quanto ho testato funziona bene (versione Mysql 5.5).

Ecco una versione completa dello 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