最佳实践-SQL脚本的语法校验

前言

系统的版本发布流程里,随需求的叠加,出现了多次版本的升级脚本填写不对或忘记补充的情况,虽然项目内已经三令五申严格要求研发必须针对SQL脚本反复走查,甚至手动执行且在无报错前提下,才能合入代码。但效果仍然较差(时间一长),基于此,项目(组件里)急需一种可以自动化校验的能力,从根源上杜绝此类问题。

一、SQL脚本校验

系统中已经提供了前置检查框架,所以在前置检查框架中叠加对应的SQL脚本校验即可,调研后使用alibaba的SQLParserUtils进行检查。
依赖的POM

        
            com.alibaba
            druid
            1.2.11
        
   SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql)

测试用例:

 public static void main(String[] args) {
        String sql = "FROM (SELECT p.datekey datekey, p.userid userid, c.clienttype  FROM detail.usersequence_client c JOIN fact.orderpayment p ON p.orderid = c.orderid  JOIN default.user du ON du.userid = p.userid WHERE p.datekey = 20131118 ) base  INSERT OVERWRITE TABLE `test`.`customer_kpi` SELECT base.datekey,   base.clienttype, count(distinct base.userid) buyer_count GROUP BY base.datekey, base.clienttype";

        SQLStatementParser hive = SQLParserUtils.createSQLStatementParser(sql, DbType.hive);
        SQLStatement statement = hive.parseStatement();
        System.out.println(statement);

        // as you can see , using this parseDriver will cause an error
//        ParseDriver pd = new ParseDriver();
//        ASTNode ast = pd.parse(sql);
//        System.out.println(ast.dump());

        sql = "create index IDX_ltp_basic_info_inventory_name on ltp_basic_info(inventory_name)";
        PgSqlChecker.format(sql, DbType.postgresql);
        SQLStatementParser pg = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql);
        statement = pg.parseStatement();
        System.out.println(statement);
    }

在具体使用中,发现有的SQL语句,还是有误判的,如:

create index IDX_ltp_basic_info_inventory_name on ltp_basic_info(inventory_name varchar_pattern_ops)
ALTER TABLE eth_resource ADD COLUMN if not exists tpid_set_pg TEXT

系统中,对于特定不支持的语法SQL,进行异常保护。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章