Setelah mencari alat CLI untuk sintaks linting di Mysql untuk digunakan di Jenkins dan tidak menemukan apa pun dengan cepat (pertanyaan Stackoverflow ini adalah salah satu hasil pertama - LOL) saya menemukan solusi berikut (OS:Linux, tetapi harus layak dengan Windows juga):
Sesuatu seperti berikut:
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
(Untuk memeriksa file sql Anda dapat menggunakan "
Jika sintaks kueri tidak dapat diuraikan oleh mysql, ia mengklaim:ERROR 1064 (42000) pada baris 1:Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat '' di baris 1
Hanya jika sintaksnya benar, ia mencoba mengeksekusi kueri dan menyadari bahwa tabel tidak ada tetapi ini tidak menarik lagi:
Oleh karena itu Kesalahan 1064 adalah sintaks yang tidak valid. Anda hanya perlu membuat database pengujian kosong karena jika tidak, hanya kesalahan dengan bagian FROM yang salah yang akan muncul (di sini misalnya database diperlukan untuk mendapatkan hasil pemeriksaan sintaks yang valid:'select asdf from s where x and if;).
Sejauh yang saya uji berfungsi dengan baik (Versi Mysql 5.5).
Berikut versi lengkap skrip 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