如何检查(我的)SQL语句的语法正确性

23
我们目前正在设置集成服务器,在此过程中,我们在SVN上设置了pre-commit钩子,以使开发人员无法提交语法无效的文件(主要是PHP和XML)。
我们还有一堆用于MySQL的.sql文件,我也想对它们进行检查。不幸的是,谷歌没有找到任何有用的信息来完成这个任务。
有什么想法吗?

1
完全相同的问题 - 系统必须处理DDL(实际上SQL文件都是DDL),以及MySQL的增强功能。 - Danny Staple
5个回答

12
在搜索用于Jenkins中Mysql语法检查的CLI工具时,我没有快速找到别的东西(这个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)第1行:您的SQL语法中有错误;请参阅与您的MySQL服务器版本相对应的手册以获取正确的语法。

只有在语法正确的情况下,它才尝试执行查询并意识到表不存在,但这已经不再有趣了:

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

优秀的解决方案!!运行得非常好。 - Frédéric Klee

6
MySQL Workbench商业版具有针对MySQL语句的语法检查器,但当然仅涵盖数据库方面。请参见http://mysql.com/products/workbench/(尽管我在免费应用程序的帮助索引中发现了这个事实)。

1
谢谢!但不幸的是我认为我无法说服我的老板购买那个只是为了为我们的集成服务器添置另一个漂亮的玩具 :) - n3rd

4
这是一个验证器,它符合SQL 92/99/2003标准,但你提到MySQL让我想到你在SQL查询中使用了MySQL特定的语法。
一种选择是采用不可知论方法处理数据库层,编写不可知论SQL代码。显然,您需要与Mimer联系,以查看是否可以脱机使用并将其集成到您的CI环境中。
整体方法有几个“如果”,这全取决于您是否愿意/能够在当前状态下编写不可知论的SQL代码。

1
有趣的链接!不幸的是,编写不依赖特定数据库的SQL不是一个选项。我们的系统有很多流量,我们需要尽可能地提高MySQL的性能(至少在某些地方)。 - n3rd
链接已失效。请提供新的链接。 - baradhili

3
我已经编写了一个CLI工具,使用phpMyAdmin SQL解析器来对SQL文件进行语法检查:php-sqllint

如何在Windows上安装并使用php-sqllint? - Lakshman Miani
我的防病毒软件显示链接到php-sqllint是恶意的/被垃圾邮件/广告感染了:( - TeeTrinker

0

免责声明:我尚未尝试过这些工具!结果可能因人而异!

PHPMyAdmin的SQL验证解析器是一个积极开发的开源项目,目前在2021年是我最好的选择。

我找到的另一个更或多或少现代的项目看起来不太成熟,但它在这里:

Persist SQL Query "根据其Github标语,这是MySQL(PHP)的最佳和最完整的查询构建器/解析器",但它并没有明确的验证功能,但从源代码中可以看到如果无法正确解析查询,则会抛出异常。

只是提一下:PHP-SQL-Parser不进行验证,因此不适合用于linting。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接