续集:ActiveRecord 的替代方案
周五我收到了一份居家编程作业。作业要求我用 Ruby 构建一个 RESTful API,但有一个很大的限制:不能使用 Rails。以下是我从中总结的一些经验——
-
能获得这个机会我感到非常兴奋,因为这是我求职过程中遇到的第二个编程挑战。熟能生巧,所以做得越多,下次我就会越自信、越得心应手。
-
在使用一些我以前从未听说过或使用过的工具/框架的过程中,我获得了宝贵的经验。其中之一就是 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。
祝您编程愉快!