gpt4 book ai didi

mysql - 如何检查(My)SQL 语句的语法正确性

转载 作者:IT老高 更新时间:2023-10-28 23:58:08 26 4
gpt4 key购买 nike

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

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

有什么想法吗?

最佳答案

在搜索用于 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 解析,它会声明:第 1 行的错误 1064 (42000):您的 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

关于mysql - 如何检查(My)SQL 语句的语法正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3970643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com