我们目前正在设置集成服务器,在此过程中,我们在SVN上设置了pre-commit钩子,以使开发人员无法提交语法无效的文件(主要是PHP和XML)。
我们还有一堆用于MySQL的.sql文件,我也想对它们进行检查。不幸的是,谷歌没有找到任何有用的信息来完成这个任务。
有什么想法吗?
我们还有一堆用于MySQL的.sql文件,我也想对它们进行检查。不幸的是,谷歌没有找到任何有用的信息来完成这个任务。
有什么想法吗?
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文件,您可以使用“<filename.sql”而不是-b -e'statement'。
如果mysql无法解析查询的语法,则会出现以下错误: ERROR 1064(42000)第1行:您的SQL语法中有错误;请参阅与您的MySQL服务器版本相对应的手册以获取正确的语法。
只有在语法正确的情况下,它才尝试执行查询并意识到表不存在,但这已经不再有趣了:
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
免责声明:我尚未尝试过这些工具!结果可能因人而异!
PHPMyAdmin的SQL验证解析器是一个积极开发的开源项目,目前在2021年是我最好的选择。
我找到的另一个更或多或少现代的项目看起来不太成熟,但它在这里:
Persist SQL Query "根据其Github标语,这是MySQL(PHP)的最佳和最完整的查询构建器/解析器",但它并没有明确的验证功能,但从源代码中可以看到如果无法正确解析查询,则会抛出异常。
只是提一下:PHP-SQL-Parser不进行验证,因此不适合用于linting。