修复开源VS Code 插件Trino Driver的三个小问题

news2024/11/25 3:43:16

前言

最近产品中使用到一款SQLTools的VS Code插件。该插件可以在VS Code中实现数据库管理,而且支持非常多的数据源类型,
官方的数据源类型有CockroachDB,MariaDB,MySQL,PostgreSQL,SQLite,Microsoft SQL Server/Azure ,
另外还有很多社区的数据源驱动。而我们使用管理的数据源类型是Trino,图标是一个小兔子。使用到的组件是
Trino Driver
但在使用这个插件时,存在两个问题。

问题

问题1是,Trino Driver不支持Https的链接,来链接Trino数据源 (一开始只有这一个问题,解决后,又发现二个。😂)
问题2是,不支持表记录的预览
问题3是,切换schema时,无法预览表记录

而我的任务就是解决这两个问题。

组件关系梳理

在我查看过SQLTools与Trino Driver的组件文档后,才发现后者依赖前者。
SQLTools充当一个平台,提供了UI和基础的对接接口。而Trino Driver是一个专为
Trino数据源做的一个适配器。其他的数据源类型支持也是如此。
而Trino Driver 这种插件是基于trino-client该项目而开发的,trino-client基于trino的http协议,
使用axios实现了trino数据源的连接,sql执行。

所以这就是他们的关系,
SQLTools 包含 Trino Driver
Trino Driver 包含 trino-client
trino-client 包含 axios,和trino HTTP API

调试,问题解决

要实现https连接数据源,还要看trino-client这个库支不支持。
在我调试时,最新正式版的trino-client(v0.2.0)是不支持的,但最新分支main是支持的。(目前作者已发布v0.2.1。支持HTTPS的方式)
于是我基于main分支,构建出一个库,替换Trino Driver中的。这样就支持的HTTPS。
但Trino Driver连接数据源时也需要多一个参数。
verifySSLCert: false

这样第一个问题就解决啦。这种问题解决方式,本质是不校验证书,而不是真正意义上的支持HTTPS

要实现真正的HTTPS方式连接数据源,还需要改造Trino Driver库,增加上传文件的表单项,并调试好axios使用证书的姿势。

第二个问题,是在连接了Trino数据源后出现的,(使用量少的插件问题都被我遇到了,不活跃的社区维护并不可靠啊。)

第二个问题就是在预览表记录数时,报了一个 OFFSET的问题。这个问题很像是SQL写的有问题。
在这里插入图片描述

遇到复杂组件,嵌套插件的问题,首先要找到是那个插件的问题,通过对比发现其他数据源插件没有这个问题,只在Trino数据源出现,于是 问题就出现在Trino Driver插件上。
没办法该呗。

一段疯狂全局搜索,找到了有OFFSET的SQL代码。凭借着自己井底之蛙的SQL知识,发现了问题所在。
该库中写的分页查询sql是这样的。

SELECT *
FROM ${(p) => p.table.label || p.table}
LIMIT ${(p) => p.limit || 50}
OFFSET ${(p) => p.offset || 0};

而在百度查询后得到的结果是,Trino的查询SQL,OFFSET一般放在LIMIT 之前,并且去掉末尾的;分号。

修改后,再调试一下。哈哈哈。。。竟然可以了。

正当我洋洋得意把插件构建出来发给测试后,过了二个小时,测试反馈说有发现了一个新的bug。
我的第一反应是,不管这个问题是什么,都绝壁是原作者写的,不可能我的。

最后的一个问题是
由于链接数据源后,会有很多schema,表是存放在schema下的,当切换schema,查看表记录时会报错。
在这里插入图片描述

出现这样的问题,发布插件时真的有人测试吗?还是说,你们只有一个schema?

没办法,这种小众的数据源和插件 很少有人去关注,你如果非要用,那你只能去尝试改改,改不了,就去和作者直接对线吧。

这个问题直接说结论吧, Trino Driver插件在接受到SQLTools传过来的参数后,在查询sql中并没有使用schema参数。以下是作者写的二段sql

SELECT *
FROM ${(p) => p.table.label || p.table}
OFFSET ${(p) => p.offset || 0}
LIMIT ${(p) => p.limit || 50}

SELECT count(1) AS total
FROM ${(p) => p.table.label || p.table};

我改后

SELECT *
FROM ${(p) => p.table.schema+'.'+p.table.label}
OFFSET ${(p) => p.offset || 0}
LIMIT ${(p) => p.limit || 50}

SELECT count(1) AS total
FROM ${(p) => p.table.schema+'.'+p.table.label}

修改后,重新构建新插件,使用新插件就可以啦。要想用正式版,还需要去催催作者,赶快review我的PR。

相关代码的PR:
https://github.com/regadas/sqltools-trino-driver/pulls?q=+author%3APmcFizz+

总结

其实遇到这种开源插件自身的bug时,我原本可以推脱说,涉及到SQL,不懂,我还有其他事要做,我已经给作者提issues。
但我并没有,我把它当做一次试炼,成长的阶梯。
只要给我时间,月亮我也给你造出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑录屏按哪个键?您可以这样操作!

案例:电脑按哪3个键,可以录屏? 【我平常喜欢使用快捷键在电脑上快速完成一些操作。最近接触到了电脑录屏,感觉使用它一系列的操作比较麻烦。想在这里问问小伙伴们,有没有使用快捷键成功操作过的朋友!】 电…

【Linux】页表的深入分析

上一篇文章介绍了线程的基本概念 而本篇文章我们来深入理解一下, CPU再调度我们以往理解的进程和如今的线程都会涉及到的一个内容: 页表 文章目录深入理解页表 *页表的实际组成*什么是page?深入理解页表 * 在介绍进程时, 博主没有深入介绍过页表. 只是简单说了 页…

DAY 40 firewalld 防火墙

firewalld防火墙是centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。 支持IPv4、IPv6防火墙设置以及以太网桥支持服务或应用程序直接添加防火墙规则接口拥有两种配置模式:临时模…

【快乐手撕LeetCode题解系列】—— 环形链表 II

【快乐手撕LeetCode题解系列】—— 环形链表 II😎前言🙌环形链表 II🙌画图分析:😍思路分析:😍源代码分享:😍总结撒花💞😎博客昵称:博客…

了解oauth2.0

1 什么是 OAuth2.0 开发授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片、视频、联系人列表等),而无需将用户名和密码提供给第三方应用。 OAuth 允许用户…

我的软件测试故事:成长、迷茫、奋斗

前言 测试工作6年,经历过不同产品、共事过不同专业背景、能力的同事,踩过测试各种坑、遇到过各种bug。测试职场生涯积极努力上进业务和技术能力快速进步过、也有努力付出却一无所得过、有对测试生涯前景充满希望认为一片朝气蓬勃过、也有对中年危机思考不…

OpenAI Embedding:快速实现聊天机器人(二)

theme: orange 本文正在参加「金石计划」 接上文OpenAI Embedding:快速实现聊天机器人(一)有讲到聊天机器人的一些概念,这篇开始讲讲这个聊天机器人的架构和流程。 总架构图 这里我参照一个现成的架构图来讲如何实现,其是基于Azure多个相关云…

香港进出口报关指南

由于香港优越的地理位置和政策支持,大部分外贸货物通过香港出口到世界各地。与内地海关相比,香港报关更简单快捷。司机可根据内地舱单填写一份香港进/出口舱单(俗称司机纸)进出香港海关,并在货物抵港后14天内申报。 香港进出口报关需要提供哪…

单机/集群/热备/磁盘阵列(RAID)的区别详解

一、单机部署(stand-alone) 单个服务器,只有一个饮水机提供服务,服务只部署一份。 二、集群部署(cluster) 服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有…

MySQL连接空闲时间超过8小时报错原因与延伸知识

1 错误原因 1.1 两个参数 MySQL服务端两个参数控制连接超时时间: wait_timeoutinteractive_timeout1.1.1 如何查看 show global variables like interactive_timeout show global variables like wait_timeout 复制代码 1.1.2 含义与区别 wait_timeout&#xf…

JAVA System.nanoTime()与GO time.Now().UnixNano()区别

JAVA System.nanoTime() public static void main(String[] args) {long nano System.nanoTime();System.out.println(nano);} 输出:701863191254000,这个值有点奇怪,System.currentTimeMillis()不是System.nanoTime()的1000000倍。 这个值…

【springcloud开发教程】路由网关——zuul

官方资料:https://github.com/Netflix/zuul/ 什么是Zuul? Zuul包含了两个主要的功能:路由和过滤 路由功能将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预&#…

Ubuntu环境安装指定版本的docker 和一键卸载dockerdocker-compose

一、环境 我的linux系统是Ubuntu 22.04 二、开始安装 卸载旧版 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine docker-ce docker.io更新apt包索引 $ sudo apt-get update安装以下…

基础工业工程(易树平、郭伏)——第四章 程序分析

第四章 程序分析 第一节 程序分析概述 一、程序分析的概念、特点及目的 1.程序分析的概念 程序分析是一种重要的生产管理工具,它是依照工作流程,从第一个工作地到最后一个工作地,全面地分析有无多余、重复、不合理的作业&…

【单片机/普中A2】学习笔记3-数码管

数码管主要概念 参考文献:点击前往 数码管分类 字形重叠数码管:将不同数字、字母与符号重叠,需要用到那个就显示那个 分段式数码管:最常见的数码管,按照笔画来显示,主要有七段式和八段式数码管 点矩阵式…

JavaScript 代码整洁之道

文章目录概述篇变量篇函数篇注释篇异常处理篇复杂判断函数篇重构篇参考资料概述篇 书写能让人读懂的代码使用英语编写代码团队协作 制定通用的规则,依靠工具让团队的代码风格保持统一,要让代码看起来是由一个人编写的,消除个人的代码风格。…

这么好看的客服组件,还是觉得接入ChatGPT,把它放在博客中那就完美了

我们在使用ChatGPT时,它的返回方式是采用流式回复。感觉这个效果不错。之前做的全都是的等全部结果请求完成,再一次性返回给用户。今天就通过流式回复的效果重写之前的程序。 前端 前端采用一个网页版的客服组件,整体的效果如下:…

小白学Pytorch系列- -torch.distributions API Transforms (2)

小白学Pytorch系列- -torch.distributions API Transforms (2) AbsTransform AffineTransform 通过逐点仿射映射进行转换yloc⁡scale xy\operatorname{loc}\text { scale } \times xyloc scale x loc (Tensor or float) : 位置参数scale (Tensor or float) : 尺度参数event…

k8s Deployment

一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod rs v1控制三个pod,删除一个pod,在rs v2上重新建立一个,依次类推,直到全部都是由rs v2控制,如果rs v2有问题,还可以…

Spark on Yarn(client和cluster模式,spark-shell 和 spark-submit 的区别,WorldCount实现与理解)

文章目录Spark on Yarn两种模式clientclusterspark-shell 和 spark-submit 的区别的理解spark-shellspark-submitWorldCount实现IDEA本地实现On Yarn 实现WorldCount图解Spark on Yarn spark on yarn 的两种模式是指 spark 应用程序的 driver 进程(负责控制和协调整…