Po wyszukaniu narzędzia CLI do lintingu składni w Mysql do użycia w Jenkins i niczego szybko nie znalazłem (to pytanie Stackoverflow jest jednym z pierwszych wyników - LOL) wymyśliłem następujące rozwiązanie (OS:Linux, ale powinno być wykonalne również w systemie Windows):
Coś w stylu:
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
(Aby sprawdzić pliki sql, możesz użyć "
Jeśli składnia zapytania nie może być przeanalizowana przez mysql, w wierszu 1:występuje błąd:BŁĄD 1064 (42000). sprawdź instrukcję, która odpowiada Twojej wersji serwera MySQL, aby znaleźć właściwą składnię w pobliżu „” w wierszu 1
Tylko jeśli składnia jest poprawna, próbuje wykonać zapytanie i zorientować się, że tabela nie istnieje, ale to już nie jest interesujące:
Dlatego błąd 1064 jest nieprawidłową składnią. Wystarczy utworzyć pustą testową bazę danych, ponieważ w przeciwnym razie pojawiłyby się tylko błędy z niewłaściwą częścią FROM (tutaj na przykład baza danych jest potrzebna, aby uzyskać poprawny wynik sprawdzania składni:'wybierz asdf z s, gdzie x i jeśli;).
O ile testowałem, działa dobrze (wersja Mysql 5.5).
Oto pełna wersja skryptu bash:ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist
#!/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