Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich (My)SQL-Anweisungen auf syntaktische Korrektheit prüfen?

Nachdem ich nach einem CLI-Tool für Syntaxlinting in Mysql gesucht hatte, das in Jenkins verwendet werden konnte, und schnell nichts gefunden hatte (diese Stackoverflow-Frage ist eines der ersten Ergebnisse - LOL), kam ich auf die folgende Lösung (Betriebssystem:Linux, sollte es aber sein auch mit Windows machbar):

Etwas wie das Folgende:

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

(Um SQL-Dateien zu überprüfen, können Sie "

Wenn die Syntax der Abfrage nicht von mysql analysiert werden kann, behauptet sie:ERROR 1064 (42000) in Zeile 1:Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax, um sie in der Nähe von '' in Zeile 1

zu verwenden

Nur wenn die Syntax korrekt ist, versucht es die Abfrage auszuführen und stellt fest, dass die Tabelle nicht existiert, aber das ist nicht mehr interessant:

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

Daher ist Fehler 1064 die ungültige Syntax. Sie müssen nur eine leere Testdatenbank erstellen, da sonst nur Fehler mit einem falschen FROM-Teil erscheinen würden (hier wird beispielsweise die Datenbank benötigt, um ein gültiges Ergebnis der Syntaxprüfung zu erhalten:'select asdf from s where x and if;).

Soweit ich getestet habe, funktioniert es gut (Version Mysql 5.5).

Hier eine vollständige Version des Bash-Skripts:

#!/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