前言
最近产品中使用到一款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。
但我并没有,我把它当做一次试炼,成长的阶梯。
只要给我时间,月亮我也给你造出来。