2010-10-19 224 views
15

我们目前正在设置集成服务器,并且在此过程中,我们在SVN上设置了预提交挂钩,以便我们的开发人员无法签入文件这在语法上是无效的(主要是PHP和XML)。如何检查(My)SQL语句的语法正确性

我们也有一堆.sql文件(用于MySQL),我也想要棉绒。不幸的是,Google没有为这项任务提供任何有用的信息。

任何想法?

+1

完全相同的问题 - 系统必须处理DDL(实际上SQL文件都是DDL),并且使用MySQL增强。 – 2014-10-09 15:02:31

回答

5

商业版本的MySQL Workbench有一个MySQL语句的语法检查器,但当然这只会覆盖数据库方面。请参阅http://mysql.com/products/workbench/(尽管我在免费应用程序的帮助索引中找到了factoid)。

+0

谢谢!但不幸的是,我不认为我可以和老板讨价还价,只是为了让我们的整合服务器有另一个整洁的玩具:) – n3rd 2010-10-20 07:28:12

3

这是一个validator,它针对SQL 92/99/2003标准进行验证,但是您提到MySQL的事实让我相信您在SQL查询中使用了MySQL特定的语法。

一种选择是在处理数据库层时使用不可知论的方法,编写不可知的SQL代码。您显然需要与Mimer联系,看看您是否可以脱机并将其集成到您的CI环境中。

总体方法中的“ifs”夫妇,这一切都取决于您在当前状态下愿意/能够编写不可知SQL代码的事实。

+1

Intersting链接!不幸的是,编写不可知的SQL不是一种选择。 Out系统有很多流量,我们需要挤出MySQL的最后一点性能(至少在某些地方)。 – n3rd 2010-10-19 21:03:01

7

在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 
1

我写了一个命令行工具,语法检查使用phpMyAdmin的SQL语法分析程序SQL文件:php-sqllint