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

时间:2010-10-19 16:43:45

标签: mysql lint syntax-checking

我们目前正在设置集成服务器,在此过程中我们在SVN上设置了预提交挂钩,这样我们的开发人员就无法检查语法无效的文件(主要是PHP和XML)。 / p>

我们也有一堆.sql文件(对于MySQL),我也想提交。不幸的是,谷歌没有提出任何有用的任务。

有什么想法吗?

5 个答案:

答案 0 :(得分:7)

在Mysql中搜索用于语法linting的CLI工具以便在Jenkins中使用并且没有找到任何快速的东西(这个Stackoverflow问题是最初的结果之一--LOL)我提出了以下解决方案(操作系统: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无法解析查询的语法,它声称: 第1行的错误1064(42000):SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的''附近使用正确的语法

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

ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist

因此错误1064是无效的语法。您只需要创建一个空的测试数据库,因为否则只会出现错误的FROM部分错误​​(例如,为了获得有效的语法检查结果,需要数据库:'从s中选择asdf,其中x和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 :(得分:5)

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

答案 2 :(得分:3)

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

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

总体方法中有几个“ifs”,这完全取决于您在当前状态下是否愿意/能够编写不可知的SQL代码。

答案 3 :(得分:1)

我已经使用phpMyAdmin SQL解析器编写了一个CLI工具来检查SQL文件:php-sqllint

答案 4 :(得分:0)

免责声明:我还没有尝试过任何这些工具!赞!

PHPMyAdmin's validating SQL parser 是一个积极开发的开源项目,将是我目前在 2021 年的最佳选择。

我发现的另一个或多或少的当前项目看起来并不成熟,但它是:

Persist SQL Query 根据其 Github 标语,“用于 MySQL (PHP) 的最佳和最完整的查询构建器/解析器”,但它没有明确验证,但从源代码中可以看出它确实抛出异常,如果查询无法正确解析。

顺便提一下:PHP-SQL-Parser 是非验证性的,因此不符合 linting 的条件。