系统的版本发布流程里,随需求的叠加,出现了多次版本的升级脚本填写不对或忘记补充的情况,虽然项目内已经三令五申严格要求研发必须针对SQL脚本反复走查,甚至手动执行且在无报错前提下,才能合入代码。但效果仍然较差(时间一长),基于此,项目(组件里)急需一种可以自动化校验的能力,从根源上杜绝此类问题。
一、SQL脚本校验系统中已经提供了前置检查框架,所以在前置检查框架中叠加对应的SQL脚本校验即可,调研后使用alibaba的SQLParserUtils进行检查。
依赖的POM
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.11</version> </dependency>
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,进行异常保护。
本站所有软件信息均由用户上传发布,版权归原著所有。如有侵权/违规内容,敬请来信告知邮箱:764327034@qq.com,我们将及时撤销! 转载请注明出处:https://www.ssyg068.com/kuaixun/2145.html
发表回复
评论列表(0条)