在Mysql中搜索CLI中的语法linting以在Jenkins中使用并且没有快速找到任何东西之后(此Stackoverflow问题是第一个结果 - LOL)我想出了以下解决方案(操作系统:Linux ,但应该是可行的与Windows太):

有点像follwoing:

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

(要检查你可以使用 “< filename.sql”,而不是-b -e '语句' SQL文件)

如果查询语法c它不会被mysql解析它声称: 错误1064(42000)在第1行:您的SQL语法中有错误;检查与你的MySQL服务器版本相对应的手册,在第1行的''附近使用正确的语法

只有在语法正确的情况下,它才会尝试执行查询并意识到表不存在,但是这不是有趣的是:

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

因此,错误1064是无效语法。您只需创建一个空的测试数据库,否则只会出现错误的FROM部分(例如,为了获得有效的语法检查结果,需要数据库:'select asdf from s where x and if;)。

据我测试它工作正常(版本Mysql 5.5)。

这里完整的bash脚本vesion:

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

Logo

更多推荐