22

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

我们还有一堆 .sql 文件(用于 MySQL),我也想对其进行 lint。不幸的是,谷歌没有为这项任务提供任何有用的东西。

有任何想法吗?

4

5 回答 5

12

在搜索了用于在 Mysql 中进行语法检查的 CLI 工具以在 Jenkins 中使用并且没有快速找到任何东西(这个 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) at line 1: You have an error in your SQL syntax; 检查与您的 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 脚本版本:

#!/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
于 2013-04-25T19:14:55.253 回答
6

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

于 2010-10-20T02:33:13.037 回答
4

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

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

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

于 2010-10-19T16:56:18.127 回答
2

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

于 2015-12-22T05:41:47.533 回答
0

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

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

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

Persist SQL Query “The best and most complete query builder/parser for MySQL (PHP)”,根据它的 Github 标语,但它没有显式验证,但从源代码你可以看到它确实抛出异常,如果查询不能正确解析。

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

于 2021-02-11T14:33:53.773 回答