写点什么

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:512591

评论

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

赋能创新,深开鸿重磅发布面向金融行业KaihongOS发行版

科技汇

在线HTML压缩工具

入门小站

工具

性能测试中的LongAdder

FunTester

性能测试 FunTester

java高级用法之:在JNA中使用类型映射

程序那些事

Java 程序那些事 3月月更 JNA

摩尔定律的现在及未来

科技新消息

架构实战营6&微信业务架构&学生管理系统方案

唐诗宋词

架构实战营-第6期 模块一课后作业

乐邦

「架构实战营」

[Day2]-[回溯] N皇后问题

方勇(gopher)

LeetCode 动态规划 数据结构算法

什么是404页面?

源字节1号

404

如何建立高效的质量保障机制

老张

软件测试 质量保障 交付能力

Hoo虎符研究院|区块链简报 20220328期

区块链前沿News

虎符 Hoo 虎符交易所

Petal Maps的美学钥匙,解锁AITO问界M5的硬核浪漫

脑极体

【ELT.ZIP】OpenHarmony啃论文俱乐部——轻翻那些永垂不朽的诗篇

ELT.ZIP

OpenHarmony 数据压缩 ELT.ZIP

Linux常用命令分享:有手就会,但能解决95%以上的问题

优麒麟

Linux 开源 计算机 优麒麟

【研讨会报名截止最后一天】全程参会,还有惊喜奖品等你拿!

龙智—DevSecOps解决方案

CI/CD 在线研讨会

成为 DevOps 工程师需要具备哪些能力?

飞算JavaAI开发助手

TDengine 和 InfluxDB 查询性能对比测试报告

TDengine

数据库 tdengine

解决报错:SSL certificate problem: certificate has expired

liuzhen007

git

分布式事务详解:分段提交与最终一致性

分布式事务 可靠消息最终一致 TCC 构架 最终一致性

React Router 6 (React路由) 最详细教程

蒋川

React react rout

AppCube快速开发问卷调查应用在WeLink发布上线

DS小龙哥

3月月更

车联网数据安全新挑战的技术应对方案

Speedoooo

车联网 物联网 数据安全 容器安全

在线常用crontab表达式大全验证解析

入门小站

工具

个全中文注释的迷你Spring!

程序员阿杜

Java spring springboot

DiDi Kafka-Manager安装和简单使用

云原生

kafka spring kafka manager

Video.js 使用教程 - 手把手教你基于 Vue 搭建 HTML 5 视频播放器

蒋川

Vue video.js

微信业务架构图&学生管理系统架构设计

高山觅流水

架构实战营 「架构实战营」

CPU的“花招”已耍完?无指令集架构颠覆旧套路

OneFlow

人工智能 机器学习 深度学习 英伟达 芯片

Linux之time命令

入门小站

Linux

Echarts 折线图完全配置指南 - 手把手教你设置 Echarts 折线图详细教程

蒋川

Vue eCharts

【躲过裁员,成功上岸】发现小公司有不好的苗头,赶紧学习!

小傅哥

面试 小傅哥 中间件 项目

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