经过1年断断续续的迭代,ClickHouse ORM 3.x 发布啦~说说它的故事吧。

回顾下2022

说来惭愧上次写博客都是22年4月份了,今年行情不好团队急剧收缩,工作几乎全扑在接手存量业务和主业务线开发之中。21年团队规模大的时候,可以有一部分时间做基建并且有一定的技术产出。22年变成了一边缩减团队规模,一边做项目交接、开发主要业务,并没有太多技术层面的学习提升。裁员还一轮一轮,收入也走了下坡路,今年的情况想必大家都差不多,是真正的寒冬。

无论如何技术不能丢下,总还得积累。这一年技术项目主要升级了前端监控基础框架 Egg -> Midway,JS 也变为了 TS,重构优化了代码和数据库。开发开源了 node-clickhouse-orm 库。经过一年时间断断续续的迭代,现在已经发布了3.x版本,大版本更新的快,但实际并没有更新太多东西,这个后面再解释。

这篇文章将会聊聊 node-clickhouse-orm 库的诞生、发展和思考。

背景与起因

在前端监控系统中,我使用了 ClickHouse,为什么选择它可以从《天啦,从Mongo到ClickHouse我到底经历了什么?》这篇文章了解。这是一个比较新兴的列数据库,生态并不那么完善。而它本身主要用作数据分析,相对来说对于 ORM 的诉求不如行数据库,并且使用 NODEJS 的 ClickHouse 开发者就更少了。所以我没有找到一个 Node ClickHouse ORM 库能帮助我减少工作量和优化代码结构。于是,我在第一次使用 ClickHouse 的时候,就着手在监控服务代码中写一个模块来实现一些我需要的 ORM 功能。这就是 node-clickhouse-orm 库的雏形。

随着模块在系统中稳定运行了一段时间,时机成熟便与另一位同事协作(仓库的另一位贡献者)开发开源了 1.x 版本。随着监控系统的迭代,ORM 开源库也在同步更新。

为什么

为什么最终产出了 node-clickhouse-orm,有必要吗?下面通过自问自答的方式来回答

问题1:可以不用 ORM 吗?

对于体验过 ORM 好处的开发者,突然说这个数据库没有 ORM 着实有点不习惯。根本原因还是在于如果没有 ORM,在开发过程中,将会存在许多低效率的工作,比如:

  1. 手动执行建库、建表、修改表结构

此类工作麻烦且容易出错。试想一个项目在多环境部署,从本地开发到更新部署测试、线上环境,同样的事情会重复做多次。

在我们项目的场景下,做了分表的逻辑,比如同一个模型的表会根据不同的子项目ID,生成不同的表。模型 User,表 user_子项目1,user_子项目2,表特别多的情况下,人工操作表结构的工作量就巨大了。

  1. 纯SQL语句写起来慢,难维护

SQL 里面很多重复的语句要通过额外代码来组织或者每个语句都直接全部手写,无法保证开发者能写出统一的代码。

数据插入和验证的代码会非常繁琐。

表里包含什么字段,都无法从项目代码中确定,需要从数据库层面熟悉每个表结构。

问题2:非要自己造个 ORM?

你们这些狗B能不能别卷了?现在做个东西,还是要反问下自己,这个轮子造出来有没有意义,整不好就要被喷。

首先市场上没有其他轮子可以使用,我对此有需求。但是如果一开始就直接上手撸一个 ORM 库,很难确定自己要优先实现哪些功能,不能快速满足业务需求,有点不切实际。

所以最初考虑是先通过一个代码模块来实现一部分 ORM,主要满足当前项目的需求。如果这个代码模块比较成熟且使用稳定了,才会去考虑单独开发一个库。这个轮子,其实就是把积累的代码做一个封装,让技术上的积累更上一层楼,产出一个成果。因此造这个轮子是基于项目本身顺水推舟的产物,并不是完全的从零到一的创作。

问题3: 为什么不通过 Sequelize 或者 TypeORM 实现为统一标准的子库

要去掌握他们的代码标准对我来说,成本太高了。大部分情况下,没有来自外部对此 ORM 的需求,都是实现有关自己需要的功能。

行列数据库本身也有一定差异。我只能参考它们的使用方式方法,来尽量让开发者使用起来感觉更相似,减少一些理解成本。

实现了哪些能力

  • 数据库连接和通信(使用三方库)
  • 表模型定义
  • 通过表模型定义来建表和同步表字段结构
  • 数据查询、插入、删除等方法
  • 支持集群配置
  • 部分数据类型验证

代码仓库中提供了中英文档,提供了所有功能的代码使用示例供参考。测试报告已上传,测试覆盖率80%以上。

回顾一下几个版本主要做的事情

1.x

搭建仓库脚手架;抽象封装代码;编写测试用例、文档。

功能上实现:数据库连接和通信;表模型定义;数据查询和插入方法;基本数据类型验证。

2.x

重构改造 ORM 的使用API;兼容集群模式;增加数据删除方法。

3.x

新增代码模型字段检测、同步修改远程数据库表结构;

完善主要数据类型和兼容所有数据类型( DATA_TYPE );

新增中文文档;

完善测试用例并上传测试报告到 coveralls.io;

代码优化重构。

小结

一年的时间,迭代的频率也并不高,现在已经来到了 3.x 版本,大版本升级过快,多少让人有点疑惑。原因是多方面的

  1. 对于 ClickHouse 本身掌握度不够
  2. 使用过的其他数据库 ORM 也并不多,经验不足
  3. 精力有限,对于库的规划不足,更多的是通过解决自己的问题去迭代库
  4. 目前使用库的开发者不多,市场需求量小,可以大胆升级代码

终归它并不完美,甚至有些 low,但目前它能满足我的需求。

收获

学习更多知识

系统代码更干净可维护性提升

有关 ClickHouse 的代码和系统中其他数据库代码变得更为相近,代码更简洁。系统代码的边界也变得非常清晰,方便区分哪些是 ORM 需要解决的,哪些是业务代码需要处理的。以后其他同事维护项目也可以层层递进,他可以先学会使用库,专心维护项目本身,而后有兴趣再考虑学习库的代码。

积累

说点关于积累的感想,最近一个朋友聊到几年前在开发一个硬件模块交互流程的时候,觉得实现的通用交互流程可以抽象为一个库方便以后使用,于是实现了一个库。最近一个陌生开发者和他成为了好友并打赏了表示感谢。据说他在尝试很多办法和库都没有打通硬件,结果搜到这个库使用之后直接就跑通了。积累的代码帮助到了别人还结交了更多同行。这位朋友感叹相信积累的力量。

对于社区开发者来说,如果觉得此 ORM 库可以帮助解决一些问题,多一个人使用,多一分认可,这个库的价值就提升一分。说明积累是值得的,相信积累的力量。

官方收录

node-clickhouse-orm 库目前已经收录在 ClickHouse 官方文档中 ,还得到了包括 ClickHouse CTO 等一些开发者的支持点赞。

https://clickhouse.com/docs/en/interfaces/third-party/client-libraries/

最后

如果你有任何建议或者需求可以给仓库node-clickhouse-orm 提 issue,也可以通过仓库文档最下方提供的联系方式加入讨论群。如果有任何相关合作机会也可以联系我,作者也想增加点收入机会,混口饭吃。

ClickHouse ORM 3.x 发布啦的更多相关文章

  1. 五一干货来袭!开源Moon.Orm标准版发布!

    标准版源代码下载: 链接:http://pan.baidu.com/s/1i3xj0f7 因五一早过(现在中旬了),解压码获取请到: http://www.cnblogs.com/humble/p/3 ...

  2. 我们一起来动手开发一个Orm框架,开源发布

    我们追求的方向 1)高性能. 这也是架构创建的目的之一,已经将它的性能提升到了极致.大家可以自己测试.我可以说其性能是数一数二的.连接地址:Moon洗冤录 2)易用性强 我想,用过Moon.ORM的应 ...

  3. 天啦,从Mongo到ClickHouse我到底经历了什么?

    前言: 在实现前端监控系统的最初,使用了 Mongo 作为日志数据存储库.文档型存储,在日志字段扩展和收缩上都能非常方便.天生的 JSON 格式和 NodeJs 配合也非常贴合.就这样度过了几个月的蜜 ...

  4. Moon.Orm 常见查询实例

    一.Moon.Orm框架总述 (您还用hibernate?实体框架?) 1.框架名:Moon 意思是月亮,而非Mono.因为很喜欢明月,所以以此为名.它是一个.NET下的Orm框架. 2.发展历史:历 ...

  5. Orm 常见查询实例

    一.Moon.Orm框架总述 (您还用hibernate?实体框架?) 1.框架名:Moon 意思是月亮,而非Mono.因为很喜欢明月,所以以此为名.它是一个.NET下的Orm框架. 2.发展历史:历 ...

  6. Hibernate 5 Maven 仓库的 Artifacts

    Hibernate artifacts 官方发布的仓库在 JBoss Maven repository 中.Hibernate 发布的 artifacts 也会同时同步到 Maven Central ...

  7. CRL2.3(ORM开发框架)源码github发布

    简介 CRL是一个面向对象的轻便型ORM业务框架 此框架追求的是使用简单,方便,因此设计为: 不需要代码生成器生成对象类,按标准方式写即可 依托lambda,实现语法解析转换为等效的SQL查询,完全以 ...

  8. Moon.Orm 5.0(MQL版)使用指南及代码生成器新版发布

    相关博文1)Moon.Orm 5.0 (MQL版) 配置说明; 2)Moon.Orm 5.0 (MQL版) 版本维护及下载(跟踪发布); 3)Moon.Orm 5.0系列文章;  4)Moon.Orm ...

  9. 一个类GraphQL的ORM数据访问框架发布

    Zongsoft.Data 发布公告 很高兴我们的 ORM 数据访问框架(Zongsoft.Data)在历经两个 SaaS 产品的应用之后,今天正式宣布对外推广! 这是一个类 GraphQL 风格的  ...

  10. .NET ORM 开源项目 FreeSql 1.0 正式版发布

    一.简介 FreeSql 是 .NET 平台下的对象关系映射技术(O/RM),支持 .NetCore 2.1+ 或 .NetFramework 4.0+ 或 Xamarin. 从 0.0.1 发布,历 ...

随机推荐

  1. 小程序返回上一级页面背景音乐报错 setBackgroundAudioState:fail title is nil!;

    小程序初始化在onLoad的时候加载了一次背景音乐. 如果此时报错是title必传.如果没有 会报错一次 setBackgroundAudioState:fail title is nil!; 这个都 ...

  2. 2022最新最详细必成功的在Vscode中设置背景图、同时解决不受支持的问题

    文章目录 1.效果展示 2.设置背景图的详细步骤 2.1 .下载background插件 2.2 .选择扩展设置 2.3 .在setting.json中编辑 2.4.对应的配置文件 2.5 .重启电脑 ...

  3. 十、RHEL Podman命令

    Podman介绍 Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用.Podman 提供与 Docker 非常相似的功能.正如前面提到的那样,它不需要在你的系统上运行任何守护 ...

  4. Linux--多线程(三)

    生产者消费者模型 概念: 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过一个来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给 ...

  5. SpringBoot&MyBatisPlus

    5. SpringBoot 学习目标: 掌握基于SpringBoot框架的程序开发步骤 熟练使用SpringBoot配置信息修改服务器配置 基于SpringBoot完成SSM整合项目开发 5.1 入门 ...

  6. Graceful Java之try...catch()

    [优美的Java代码之try...catch] 目录 概述 优化 优化前写法(JDK1.7之前) 优化后写法(JDK1.7及以后) 延伸阅读:嵌套的文件流如何正确的关闭 概述 通常我们使用try... ...

  7. Django更换数据库和迁移数据方案

    前言 双十一光顾着买东西都没怎么写文章,现在笔记里还有十几篇半成品文章没写完- 今天来分享一下 Django 项目切换数据库和迁移数据的方案,网络上找到的文章方法不一,且使用中容易遇到各类报错,本文根 ...

  8. jvm调优思路及调优案例

    jvm调优思路及调优案例 ​ 我们说jvm调优,其实就是不断测试调整jvm的运行参数,尽可能让对象都在新生代(Eden)里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时 ...

  9. php统一的gocheck方法

    这半个月断断续续在学习用PHP的ThinkPHP框架开发后端API.现在总结记录一下开发一个接口需要做好哪些事,以此提高开发效率,并且也有不错的扩展性. 一.流程概要 基本是这么一个流程,略过环境搭建 ...

  10. 【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」

    日志追踪 日志追踪对于功能问题的排查和数据流转的路径分析时非常重要的,有了全链路日志追踪体系机制可以非常有效且快速的定位问题,但在多线程环境中,若没有相关成熟的框架的支持,想要实现日志追踪,就需要手动 ...