我如何检查(我的)SQL语句的句法正确性
-
09-10-2019 - |
题
我们目前正在设置Integration Server,在此过程中,我们已经在SVN上设置了预密码挂钩,以便我们的开发人员无法签入语法无效的文件(主要是PHP和XML)。
我们也有一堆.sql文件(用于mySQL),我也想覆盖这些文件。不幸的是,Google并没有为此任务提供任何有用的东西。
有任何想法吗?
解决方案
这 商业的 MySQL Workbench的版本具有用于MySQL语句的语法检查器,但当然只能涵盖数据库方面。看 http://mysql.com/products/workbench/ (尽管我在免费应用程序的帮助索引中找到了FACTOID)。
其他提示
在搜索了MySQL中用于在Jenkins中使用的CLI工具以获取语法鳞片,但没有快速找到任何东西(这个stackoverflow问题是第一个结果之一 - 大声笑),我提出了以下解决方案(OS:Linux,但应该是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
(要检查SQL文件,您可以使用“ <filename.sql”而不是-b -e'语句')
如果查询的语法无法通过mySQL解析,则声称:错误1064(42000)在第1行中:您的SQL语法中有错误;检查与您的MySQL Server版本相对应的手册,以获取正确的语法
只有语法是正确的,它才能执行查询并意识到表不存在,但这不再有趣:
ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist
因此,错误1064是无效的语法。您只需要创建一个空的测试数据库,因为否则只会出现一个错误的错误(例如,在这里需要数据库才能获得有效的语法检查结果:'从s中x选择ASDF,其中x和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
这里有一个 验证器, ,它根据SQL 92/99/2003验证标准,但是您提到的MySQL的事实使我相信您在SQL查询中使用了MySQL特定语法。
一种选择是在处理您的数据库层,编写不可知论SQL代码时转移到不可知论方法。显然,您将需要与Mimer接触,以查看是否可以离线将其集成到CI环境中。
总体方法中的几个“ ifs”,这一切都取决于您愿意/能够在当前状态下编写不可知论SQL代码的事实。
我已经编写了一个CLI工具来使用PhpMyAdmin SQL解析器来检查SQL文件: php-sqllint.