当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何检查(我的)SQL语句的语法正确性》经验,为你挑选了2个好方法。

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

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

有任何想法吗?



1> Georg Buske..:

在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文件,可以使用"

如果mysql无法解析查询的语法,则声明:第1行的ERROR 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脚本版本:

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



2> Richard Care..:

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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有