系统的版本发布流程里,随需求的叠加,出现了多次版本的升级脚本填写不对或忘记补充的情况,虽然项目内已经三令五申严格要求研发必须针对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 条评论) “” |