След като потърсих CLI инструмент за синтаксис linting в Mysql, който да използвам в Jenkins и не намерих нищо бързо (този въпрос на Stackoverflow е един от първите резултати - LOL), стигнах до следното решение (ОС:Linux, но трябва да бъде възможно и с Windows):
Нещо като следното:
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
(За да проверите sql файловете, можете да използвате "
Ако синтаксисът на заявката не може да бъде анализиран от mysql, той твърди:ГРЕШКА 1064 (42000) на ред 1:Имате грешка във вашия SQL синтаксис; проверете ръководството, което съответства на версията на вашия MySQL сървър за правилния синтаксис, който да използвате близо до '' на ред 1
Само ако синтаксисът е правилен, той се опитва да изпълни заявката и разбира, че таблицата не съществува, но това вече не е интересно:
Поради това грешка 1064 е невалиден синтаксис. Трябва само да създадете празна тестова база данни, защото в противен случай ще се появят само грешки с грешна FROM част (тук например базата данни е необходима, за да получите валиден резултат от проверка на синтаксиса:'select asdf from s, където x и if;).
Доколкото тествах, работи добре (Версия Mysql 5.5).
Ето пълна версия на 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