【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

Sequel:Ruby 的数据库工具包

  • 2008-12-22
  • 本文字数:2594 字

    阅读完需:约 9 分钟

实际上 ActiveRecord 才是 Rails 的 ORM。但除了 ActiveRecord 外, Sequel (v2.7.1)提供了一个更为完整的 Ruby 工具包来处理数据库的操作。

  • Sequel 具有线程安全,连接池等特性,同时提供了简洁的 DSL 用来创建数据库查询以及表方案。
  • Sequel 也包含一个轻量级但更全面的 ORM 层用来映射记录和 Ruby 对象并处理相关联的记录。
  • Sequel 支持高级的数据库特性,比如语句准备,参数绑定主 / 从配置,以及数据库分片
  • Sequel 使得处理多个记录更加方便。
  • Sequel 当前提供的适配器可以支持 ADO、DB2、DBI、Informix、JDBC、MySQL、ODBC、OpenBase、Oracle、PostgreSQL 以及 SQLite3。

Sequel DSL 的一个例子:
DB[:countries].filter(:region => 'Middle East').reverse_order(:area).<wbr></wbr>limit(5).avg(:GDP)

其将会被翻译成 SQL 语句:

SELECT avg(GDP) FROM countries WHERE region = 'Middle East' ORDER BY area DESC LIMIT 5

项目的最新修改会反映在

changelog 中,最新的稳定版本可以查看项目基线。

InfoQ 有机会采访了 Jeremy Evans,在访问中他谈及了关于 Sequel 的进展和与 ActiveRecord 性能和特性比较的一些问题。

InfoQ ─ 在以前的采访中,Sharon Rosner 提到,他启动 Sequel 项目的原因在于 Rails 缺乏多线程和连接池的特性。但自从 Rails 2.2 版本开始,Rails 已经支持这些特性了,那么我们是否还应该选择 Sequel 呢?

Jeremy ─ 我没有用过 ActiveRecord 新的连接池的特性,因此我不能将其与 Sequel 进行比较。Sequel 的连接池特性在我接管这个项目之前就已经完成并使用了,而且从其反馈来看几乎没有问题,因此我非常自信的认为 Sequel 的实现是健壮的。时间会告诉我们是否 ActiveRecord 的实现也一样好。

还有什么其他的原因吗?是否 Sequel 相对于 ActiveRecord 在处理大数据集和多个记录上更为敏捷?尽可能的避免纯 SQL,是不是让 Sequel 相对于 ActiveRecord 更 ruby 化?是否在其他的一些领域 Sequel 的性能比 ActiveRecord 要好?或者不如 ActiveRecord?

Sequel 使用 SQL 并将其暴露在 ruby 层次上。对于 ActiveRecord 来说,你需要使用 SQL 字符串来拼接生成查询语句,而使用 Sequel 你只需要直接使用 ruby 对象。Sequel 当然是一个更 ruby 化的数据库工具库,你甚至可以不使用任何的 SQL 串而完成特殊的应用。 两个框架的有一些方面甚至完全不一样。比如,Sequel 支持主 / 从数据库、数据库分片、绑定参数以及语句准备。ActiveRecord 不支持这些(至少是不使用插件时不支持),但是 ActiveRecord 的方案解析器相比 Sequel 特性更为丰富,而且 ActiveRecord 支持一些其他相关的类型(比如多态关联特性),Sequel 也可以支持但是使用起来不很方便。

我不确信是否性能是使用 Sequel(或者 ActiveRecord)的一个原因。有些情况,比如,当选择很多你并不使用的列时 ActiveRecord 的性能更好。Sequel 执行类型转换是在从数据库获取数据时就进行转换,而 ActiveRecord 直到使用数据时才延迟进行转换。这并不是一个主要的问题,除非你使用的类型是日期型,因为 ruby 的日期型的数据实例化起来非常慢。要是你只是选择一些你使用的列的话,Sequel 应该会更快。如果查询可以简化为一条单独的语句,未进行优化的情况下,Sequel 的执行效果相对要差,反之会优于 ActiveRecord。

尽管 Sequel 支持很多的数据库,但是大多数性能上的改进都是面向 PostgreSQL 或 MySQL 的;对于其他数据库操作性能上的改进你是否一样有信心呢?

在我的产品应用程序的开发中只使用到了 PostgreSQL 数据库,所以大多数的数据库的优化工作都是针对 PostgreSQL 的,因为这对我的应用程序最有好处。有些应用程序的测试中,我使用到了 SQLite ,而且唯一一次使用 MySQL 是跟它一起测试 Sequel 时用到的。其他 Sequel 支持的数据库我自己还没有测试过。 针对你的问题,我的答案是“没有”,我并没有充足的信心,因为我还没有将 Sequel 用于其他的数据库进行应用的经历。但我印象中还没有人提出关于性能方面的意见。

这些采访的时间是在 10 个月以前,当时 Sequel 的版本还是 0.5 版本。从那时起,你负责领导这个项目的开发。那么,就你个人而言,你认为 v2.7.1 最重要的特性有哪些呢?在开发路线图中,未来是否会有什么非常特别的特性么?你是否有一些开发者使用 Sequel 进行 Rails/Merb 开发成功的案例?

直至 1.2 版本我才开始使用 Sequel,因此对于以前的一些修改我并不清楚。从 1.2 版本起,最重要的修改以及新的特性是: 1) 返璞归真:在 2.0 版本之前,Sequel 的实现采用了很多奇技淫巧。在版本 1.5 至 2.0 之间,对该特性进行了很多重要的修改,使得代码更为清晰而且更便于使用。

  1. 文档:当我接管这个项目的时候,Sequel 大部分都没有文档。而现在,所有的 Sequel 至少都有基本的文档,除了一些适配器之外。

  2. 关联:Sequel 具有任何 ruby ORM 上最强大的关联特性。ActiveRecord 实现了一些很少使用的特殊的关联类型(比如多态关联特性),而 Sequel 更加强大,它通过将更多的内部工作暴露给用户同时允许更细粒度的控制实现了 ActiveRecord 不允许的一些关联特性。

  3. 数据集图解:这个特性使你可以连接两个任意的数据集(表),并将结果分成要素表。当你需要连接两个有同名列的表,又不想使用列别名再手动将结果集拆分成要素表时,这个特性就能派上用处,它能为你搞定这一切。

  4. 表达式过滤器 DSL:以前对于高级的过滤来说,Sequel 使用解析树,其性能不尽人意而且不能在 JRuby 或是 Ruby 1.9 上使用。 表达式过滤器 DSL 非常易用,性能更好,可以在所有 ruby 的实现框架上使用。DSL 可以使类似“dataset.filter(:number > 2)”的代码正确运行。

  5. JRuby 和 Ruby 1.9 支持:三个最为广泛使用的 ruby 实现 Sequel 现在都支持。

  6. 语句准备 / 参数绑定:Sequel 允许使用真实的数据库的准备语句以及在一些数据库上的参数绑定,一些其他数据库上模拟支持此特性。准备语句相比普通查询来说要快很多,当然跟使用的数据库有关系。

  7. 主 / 从数据库以及数据库分片:Sequel 支持主 / 从(只读)数据库,以及数据库分片。

未来的路线图方面,还没有太多的考虑。我的思想很开放,但是目前 Sequel 的特性基本上满足了所有的需要。现在的工作主要是修改一些细节的问题,还没有什么计划的新特性。

我知道有很多使用 Sequel 的 Rails、Merb、Ramaze 以及 Sinatra 的应用实现。就我个人而言,在应用开发中使用的就是 Sequel 和 Rails 或 Ramaze。

2008-12-22 09:512320

评论

发布
暂无评论
发现更多内容

五种IO模型

懒AI患者

io nio AIo bio IO多路复用

想象力,科幻与其他「关于科幻 8/28」

道伟

28天写作

Java 程序经验小结:接口只用于定义类型

后台技术汇

28天写作

胆大无险,脚踏实地

.

28天写作

Soul 网关实践 02|选择器&规则介绍

哼干嘛

Java 探索与实践 Soul网关

【计算机内功修炼】六:10张图让你彻底理解回调函数

码农的荒岛求生

异步 同步 异步IO 回调函数 异步编程

创业失败启示录|校园微生活之留学生面对面

阿萌

28天写作 创业失败启示录 青城

从硅谷到小米,崔宝秋的25年开源人生

李忠良

28天写作

Soul 网关实践 03|http 请求接入网关

哼干嘛

Java 探索与实践 Soul网关

【CSS】文字特效(text-shadow)

德育处主任

CSS css3 html/css CSS小技巧 28天写作

正则表达式匹配ini文件的section

老王同学

区块链介绍

v16629866266

区块链

深入理解nodejs中的异步编程

程序那些事

多线程 nodejs 异步编程 程序那些事 回调

架构师训练营 - 第三周作业

Mark

CMS系统——登录功能

程序员的时光

程序员 七日更 28天写作

读书笔记:《激荡三十年》下

lidaobing

28天写作 激荡三十年

【Mysql-InnoDB 系列】事务提交过程

程序员架构进阶

MySQL 架构 innodb 事务 28天写作

早上听了一场关于财富的线上专题分享

熊斌

财富自由 28天写作

28天瞎写的第二百一九天:包辆三轮车上班的日子

树上

28天写作

像用户一样测试:别掉链子

QualityFocus

软件测试 用户体验 回归测试

生产环境全链路压测建设历程 29:FAQ 之 评估方法论、改造、痛点

数列科技杨德华

28天写作

智能building之 园区

张老蔫

28天写作

如何通过即构小程序组件实现直播带货功能?

ZEGO即构

小程序 直播带货

2021年“区块链+”将会如何发展?

CECBC

区块链

沉寂唯品会3年,毅然辞职冲刺阿里,我是怎么备战金三银四的?

比伯

Java 编程 架构 面试 程序人生

日语复习 Day02【~あっての】

IT蜗壳-Tango

程序员 七日更 日语语法

项目管理系列(3)-如何开好一个项目启动会

Ian哥

项目管理 28天写作

低代码是在炒概念,炒得不错

Justin

低代码 28天写作

短视频+直播=最自然的表达方式?| 视频号 28 天 (09)

赵新龙

28天写作

重学JS | 箭头函数为什么不能用做构造函数?

梁龙先森

面试 大前端 编程语言 28天写作

[6/28]产品业务数据分析的质量实践

L3C老司机

Sequel:Ruby的数据库工具包_Ruby_Sebastien Auvray_InfoQ精选文章