sql数据源名称过长_使用Druid解析SQL小试

这是学习笔记的第 1862篇文章

Druid在行业内是一个很流行的开源工具,在很多开发项目里的数据源选型都是它,按照官方的参考数据,Druid的性能非常好,都是纳秒级别。

GitHub上Druid的星有一万多,光提交的issue就有1000多个,可见在社区里面也算是久经沙场了。

2c9931c3ee528c9785eaf0e444ea6a48.png

Druid和开发方向关系比较紧密,和DBA方向有什么关系呢。其实还是回归到本质,和SQL有关,在SQL方向目前存在几个瓶颈。

  1. 行业内的审核工具对于DML的支持很有限。
  2. 开源工具和数据库的绑定比较紧,不够通用,难以实现SQL方言化解析.
  3. 语法和词法分析是一个技术活,单纯分析文本做解析简单粗暴,没有体系化就难以实现扩展。

鉴于目前MySQL方向走得快一些,其他方向的事务性工作依旧繁琐,所以我希望在已有的基础上做一个大的改变,那就是SQL审核2.0版本,通过提供通用的技术体系来支撑通用的数据库规范。

Druid不光作为一个通用的数据源性能优越,而且里面也内置了大量的辅助功能。 其实看到Druid实现的demo,会发现它早已超出了本身的定位,可以做一些监控和优化,还有SQL解析器。

我们可以完全站在巨人的肩膀上,把这些信息继承起来,然后融入我们自定义的逻辑来满足当前的业务需求。

如果你不熟悉Java,按照GitHub的方式来编译Druid,这应该会是一个不好的开始。

因为摆在你面前的第一道门槛就是maven,其实maven就是一个档案库,我们可以从里面提取得到相关的软件。对于maven,就类似于我们使用yum的方式是类似的。

我们要创建一个java项目,以maven的方式创建。

在pom.xml引入如下的依赖即可。

com.alibaba druid 1.1.10

新建一个Java文件,代码类似下面的形式。

import java.util.List;import com.alibaba.druid.sql.SQLUtils;import com.alibaba.druid.sql.ast.SQLStatement;import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;import com.alibaba.druid.util.JdbcConstants;/** * Hello world! * */public class Test { public static void main(String[] args) { //String sql = "update t set name = 'x' where id < 100 limit 10"; // String sql = "SELECT ID, NAME, AGE FROM USER WHERE ID = ? limit 2"; // String sql = "select * from tablename limit 10"; String sql = "CREATE TABLE `define_cdetag` (" + " `id` int(32) unsigned NOT NULL COMMENT '配置项使用时标识'," + " `thiSection` varchar(32) DEFAULT NULL COMMENT 'StageID白名单区间'," + " `thiExceptList` text COMMENT 'test名单列表'," + " PRIMARY KEY (`id`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';"; String dbType = JdbcConstants.MYSQL; //格式化输出 String result = SQLUtils.format(sql, dbType); System.out.println(result); // 缺省大写格式 List stmtList = SQLUtils.parseStatements(sql, dbType); //解析出的独立语句的个数 System.out.println("size is:" + stmtList.size()); for (int i = 0; i < stmtList.size(); i++) { SQLStatement stmt = stmtList.get(i); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); //获取表名称 //System.out.println("Tables : " + visitor.getCurrentTable()); //获取操作方法名称,依赖于表名称 System.out.println("Manipulation : " + visitor.getTables()); //获取字段名称 System.out.println("fields : " + visitor.getColumns()); System.out.println(visitor.getColumn("define_cdetag
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Druid是一款非常优秀的实时OLAP数据库。它具有高性能、高可用、高可靠的特点,广泛应用于海量数据实时查询和分析。在Druid中,可以使用Druid SQL查询数据,而Druid SQL不仅可以查询数据,还可以分析SQL的血缘关系,实现血缘关系计算。 血缘关系计算是指分析SQL中的每个字段,找出它们来源的表、字段、过滤条件等信息,然后根据这些信息,计算出每个字段的血缘关系。这样,就可以清楚地知道一个字段是从哪个表的哪个字段计算出来的,从而对数据的来源和计算过程有更加深入的理解。 在Druid中,可以使用Apache Calcite来解析SQL,然后根据解析结果,计算血缘关系。具体来说,可以通过以下步骤实现: 1. 首先,需要配置Druid SQL。在Druid的配置文件中,可以设置"druid.sql.enable"参数为"true",表示开启Druid SQL功能。 2. 然后,在应用程序中,可以使用Druid SQL的API来解析SQL。具体来说,可以使用"SqlParser"类来解析SQL,返回一个"SqlNode"对象,表示SQL语句的语法树。 3. 接着,可以使用Apache Calcite提供的"RelBuilder"类来构建SQL语句的逻辑计划。具体来说,可以将"SqlNode"对象转换为"RelNode"对象,然后使用"RelBuilder"类来构建逻辑计划。 4. 最后,可以使用Apache Calcite提供的"RelOptUtil"类,计算逻辑计划的血缘关系。具体来说,可以使用"RelOptUtil"类的"computeLineage"方法,计算每个字段的血缘关系。 通过以上步骤,就可以实现Druid SQL的血缘关系计算。在实际应用中,可以将血缘关系保存到数据库中,供后续分析和查询使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值