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

问题描述 投票:0回答:6

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

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

有什么想法吗?

mysql lint syntax-checking
6个回答
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" instead of -b -e 'statement')

如果mysql无法解析查询的语法,它会声明: ERROR 1064 (42000) at line 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 脚本版本:

#!/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

6
投票

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


4
投票

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

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

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


3
投票

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


0
投票

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

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

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

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

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


0
投票

我建议尝试 sqlfluff cli 工具,“The SQL Linter for Humans”。

它有一个 文档部分专门介绍如何将其用作预提交挂钩

请在我的其他答案中查看有关使用它的更多信息,这里

© www.soinside.com 2019 - 2024. All rights reserved.