发布于 2026-01-06 2 阅读
0

续集:ActiveRecord 的替代方案

续集:ActiveRecord 的替代方案

周五我收到了一份居家编程作业。作业要求我用 Ruby 构建一个 RESTful API,但有一个很大的限制:不能使用 Rails。以下是我从中总结的一些经验——

  1. 能获得这个机会我感到非常兴奋,因为这是我求职过程中遇到的第二个编程挑战。熟能生巧,所以做得越多,下次我就会越自信、越得心应手。

  2. 在使用一些我以前从未听说过或使用过的工具/框架的过程中,我获得了宝贵的经验。其中之一就是 Sequel,这也是我今天要介绍的内容。

为了完成挑战,我被要求使用 Sequel 而不是 ActiveRecord,这可真是一个不小的挑战。我对 Sequel 的看法仍然摇摆不定。最初,我甚至怀疑为什么会有人放弃 ActiveRecord 而选择这个“宝石”。但在使用过程中,我发现它有一个优点,这让我对它的看法有所改观。等我写完这篇博文,大家就会知道是什么优点了。

什么是续集?

Sequel 是一个 Ruby gem,它提供了一个“简单、灵活且强大的 SQL 数据库访问工具包”。换句话说,它与广泛使用的 ActiveRecord gem 类似。Sequel 允许你像 ActiveRecord 一样运行迁移、查询和操作数据库。

Sequel支持的数据库类型

Sequel 目前支持以下数据库类型:ADO、Amalgalite、IBM_DB、JDBC、MySQL、Mysql2、ODBC、Oracle、PostreSQL、SQLAnywhere、SQLite3 和 TinyTDS。

安装 Sequel

要使用 Sequel,您必须先将 gem 包安装到您的项目中。为此,请打开您的 Gemfile 文件并添加 `gem install sequel` gem ‘sequel’。您需要$ bundle install在终端中运行 `gem install sequel` 来安装该 gem 包。

在你的application.rb文件中,你需要require ‘sequel’像使用 ActiveRecord 一样进行操作。

创建数据库

我发现 Sequel 的一个独特之处(当然,我在弄明白这一点时遇到了一个错误),就是必须先创建数据库,然后才能尝试将 Sequel 连接到数据库。

要创建数据库,请运行以下命令(使用您自己的数据库名称) - $ createdb pets_development.

注意:本教程中使用的是PostgreSQL数据库。它的数据库创建方式与SQLite3略有不同,如果您使用的是其他类型的数据库,请注意这一点并访问此页面。

创建迁移文件

创建迁移文件在布局上与 ActiveRecord 非常相似,但是没有像 ActiveRecord 那样简单的命令可以运行rake db:create。我是手动创建迁移文件的,但需要注意的是,您仍然需要在文件名开头添加时间戳,因为 Sequel 要求这样做。

# 20190514_dogs.rb
Sequel.migration do
  change do
    create_table(:dogs) do
      primary_key :id
      String :name, :null => false
      String :breed, :null => false
      foreign_key :owner_id, :people
    end
  end 
end 

# 20190514_owners.rb
Sequel.migration do
  change do
    create_table(:owners) do
      primary_key :id
      String :name, :null => false
    end
  end 
end

连接到数据库

现在数据库和迁移文件都已创建完成,我们需要将 Sequel 连接到数据库。为此,您需要找到您的application.rb文件并添加以下代码:

# application.rb

# establishes Sequel connection to db
DB = Sequel.connect(adapter: :postgres, database: pets_development', host: 'localhost')

:连接数据库的方法有很多种,这只是我个人偏好的方法。本文包含其他选项。

另注:创建模型后无法连接到数据库,因此请务必在创建模型之前完成此连接步骤(我曾为此付出惨痛代价)。

模型创建

Sequel 中的模型设置与 ActiveRecord 非常相似。

# dog.rb 
class Dog < Sequel::Model
  many_to_one :person

  def validate
    super
    errors.add(:name, "must be present") if name.empty?
    errors.add(:breed, "must be present") if breed.empty?
  end
end

# owner.rb 
class Owner < Sequel::Model
  one_to_many :dogs

  def validate
    super
    errors.add(:name, "must be present") if name.empty?
  end
end

运行迁移

现在,我们来到了数据库设置的最后一步:运行迁移。遗憾的是,运行迁移不像$ rake db:migrate使用 ActiveRecord 那样简单,只需输入命令即可。不过幸运的是,我们仍然可以通过命令来完成这项工作。运行$ sequel -m db/migrate/ postgres://localhost/pets_development.

注意:'db/migrate/' 是我的迁移文件路径,请将其替换为您自己的路径。

数据库初始化

我为这个项目创建了种子文件,所以我会解释一下如何进行设置。首先,我们需要安装一个有用的 gem Sequel-Seed。打开你的 Gemfile 文件,添加以下内容,require ‘sequel-seed’然后运行命令$ bundle install

接下来,我们需要创建种子文件。种子文件名开头也需要包含时间戳。

# 20190514_dogs_seed.rb 
Sequel.seed do
  def run
    [
      [buddy, labrador, 1],
      [spot, golden retriever, 1],
      [princess, beagle, 2]
    ].each do |name, breed, owner_id|
      Dog.create name: name, breed: breed, owner_id: owner_id
    end
  end
end 

# 20190514_owners_seed.rb
Sequel.seed do
  def run
    [
      [angie],
      [bill],
    ].each do |name|
      Dog.create name: name
    end
  end
end

打开你的application.rb文件,插入以下代码以加载种子扩展并初始化数据库:

# application.rb
require sequel/extensions/seed

# loads the extension
Sequel.extension :seed 

# seeds the database
Sequel::Seeder.apply(DB, db/seeds/)

查询

Sequel 中的查询与 ActiveRecord 中的查询有些类似。使用 `is_dogs`Dog.all将返回数据库中的所有狗狗。您可以使用 `is_first_instances`.first.last`is_last_instances` 来获取数据库中某个对象的第一个和最后一个实例。`is_orders`.order允许您对数据库中的实例进行排序。您可以使用 `is_all_instances`来查找数据库中与给定对象键匹配的所有实例。您可以在此处.where()查看更多相关内容

原始 SQL 查询

Sequel 的一个非常棒的功能是,你可以直接向数据库发送原始 SQL 查询语句。例如,你可以这样做:

DB['select * from owners'].each do |row|
  p row
end

最后想说的话

我非常喜欢使用原生 SQL 的功能。我热爱 SQL 查询,并且总是会抓住机会练习我的 SQL 技能。Sequel 的这一特性彻底改变了我对它的看法。它和 ActiveRecord 的确差别不大,但我仍然更喜欢使用 ActiveRecord。原因在于它的rake db命令功能。这些命令让开发工作变得轻松许多

我确实认为 Sequel 是一个很棒的工具,可以作为 ActiveRecord 的替代方案。希望这篇文章能引起您的兴趣,或许还能让您有兴趣尝试一下 Sequel。

祝您编程愉快!

来源

Sequel:Ruby 数据库工具包
Sequel 入门指南

文章来源:https://dev.to/torianne02/sequel-an-alternative-to-activerecord-5d6l