Jenkinsで使用するMysqlで構文リンティング用のCLIツールを検索したところ、すぐには何も見つかりませんでした(このStackoverflowの質問は最初の結果の1つです-LOL)次の解決策を思いつきました(OS: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ファイルを確認するには、-b -e'ステートメント'の代わりに"
クエリの構文をmysqlで解析できない場合は、次のように主張します。1行目のERROR 1064(42000):SQL構文にエラーがあります。 1行目の''の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください
構文が正しい場合にのみ、クエリを実行してテーブルが存在しないことを認識しようとしますが、これはもう面白くありません:
そのため、エラー1064は無効な構文です。空のテストデータベースを作成する必要があるのは、FROM部分が間違っているエラーのみが表示されるためです(たとえば、有効な構文チェック結果を取得するには、データベースが必要です。'select asdf from s where x and if;)。
私がテストした限り、それは正常に動作します(バージョンMysql5.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