我们目前正在设置集成服务器,在此过程中,我们在 SVN 上设置了预提交挂钩,以便我们的开发人员无法签入语法无效的文件(主要是 PHP 和 XML)。
我们还有一堆 .sql 文件(用于 MySQL),我也想对其进行 lint。不幸的是,谷歌没有为这项任务提供任何有用的东西。
有任何想法吗?
我们目前正在设置集成服务器,在此过程中,我们在 SVN 上设置了预提交挂钩,以便我们的开发人员无法签入语法无效的文件(主要是 PHP 和 XML)。
我们还有一堆 .sql 文件(用于 MySQL),我也想对其进行 lint。不幸的是,谷歌没有为这项任务提供任何有用的东西。
有任何想法吗?
在搜索了用于在 Mysql 中进行语法检查的 CLI 工具以在 Jenkins 中使用并且没有快速找到任何东西(这个 Stackoverflow 问题是第一个结果之一 - 大声笑)后,我想出了以下解决方案(操作系统: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 文件,您可以使用 "< filename.sql" 而不是 -b -e 'statement')
如果 mysql 无法解析查询的语法,它声称: ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; 检查与您的 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 脚本版本:
#!/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
MySQL Workbench的商业版本有一个用于 MySQL 语句的语法检查器,但当然这只会涵盖数据库方面。请参阅http://mysql.com/products/workbench/(尽管我在免费应用程序的帮助索引中找到了 factoid)。
这是一个验证器,它根据 SQL 92/99/2003 标准进行验证,但是您提到 MySQL 的事实让我相信您在 SQL 查询中使用了 MySQL 特定的语法。
一种选择是在处理数据库层时采用不可知的方法,编写不可知的 SQL 代码。您显然需要与 Mimer 取得联系,看看您是否可以将其离线并将其集成到您的 CI 环境中。
整体方法中有几个“如果”,这完全取决于您在当前状态下愿意/能够编写不可知的 SQL 代码的事实。
我编写了一个 CLI 工具来使用 phpMyAdmin SQL 解析器检查 SQL 文件的语法:php-sqllint。
免责声明:我还没有尝试过任何这些工具!YMMV!
PHPMyAdmin 的验证 SQL 解析器是一个积极开发的开源项目,在 2021 年将是我现在最好的选择。
我发现的另一个或多或少的当前项目看起来并不成熟,但它是:
Persist SQL Query “The best and most complete query builder/parser for MySQL (PHP)”,根据它的 Github 标语,但它没有显式验证,但从源代码你可以看到它确实抛出异常,如果查询不能正确解析。
顺便提一下:PHP-SQL-Parser是非验证的,因此它不符合 linting 的条件。