代码之家  ›  专栏  ›  技术社区  ›  n3rd

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

  •  16
  • n3rd  · 技术社区  · 15 年前

    我们还有一堆.sql文件(用于MySQL),我也希望对它们进行精简。不幸的是,谷歌没有找到任何有用的东西来完成这项任务。

    有什么想法吗?

    4 回复  |  直到 15 年前
        1
  •  5
  •   Richard Careaga    15 年前

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

        2
  •  9
  •   Georg Buske    12 年前

    有点像下面这样:

    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')

    第1行出现错误1064(42000):SQL语法有错误;请查看与MySQL服务器版本相对应的手册,以获取在第1行“”附近使用的正确语法

    只有当语法正确时,它才会尝试执行查询并意识到表不存在,但这不再有趣:

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

    因此,错误1064是无效语法。您只需要创建一个空的测试数据库,否则只会出现来自错误部分的错误(例如,这里需要该数据库才能获得有效的语法检查结果:“select asdf FROM s s where x and 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
    
        3
  •  3
  •   kennytm    7 年前

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

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

        4
  •  1
  •   cweiske agentofuser    9 年前

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

    推荐文章