我们目前正在设置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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top