DataMapper是ruby的另外一个ORM库(之前了解过Active Record)。DataMapper相对较新,完全用ruby写的。安装比较简单:
gem install data_mapper
我们打算使用SQLite,所以需要安装它的适配器:
gem install dm-sqlite-adapter
同样来自《Jump start sinatra》的例子,假设我们创建一个歌单,编辑song.rb文件,输入如下内容:
require 'dm-core' require 'dm-migrations' DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/development.db") class Song include DataMapper::Resource property :id, Serial property :title, String property :lyrics, Text property :length, Integer property :released_on, Date end DataMapper.finalize
上述设置development.db这个SQLite数据库,建立了一个名为Song的类,这个类随后会被映射成数据库的表。
在Song类里,include了DataMapper::Resource模块,引入相应方法。property这个方法定义对象的属性(也就是表的字段类型),例如有如下属性:
Serial 自增的ID(主键)
String 文本串,最大256字符
Text 长文本片段
Integer 整数
Float 浮点数
Boolean 布尔值
DateTime 日期时间
DataMapper.finalize方法是必须的,放在所有使用DataMapper的类之后,用来检查完整性。
现在编写另一个脚本load.rb,放在跟song.rb同一目录下,输入:
require './song' Song.auto_migrate!
运行这个脚本,就创建了development.db这个SQLite数据库文件。
请注意这个方法每次执行会drop掉之前存在的数据(如果有)。
在命令行运行sqlite3 development.db,登入后运行如下命令:
sqlite> .schema songs CREATE TABLE "songs" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "title" VARCHAR(50), "lyrics" TEXT, "length" INTEGER, "released_on" DATE);
可以查看表结构和属性。
下面开始操作数据库。数据库有4种基本操作行为CRUD,代表创建、读取、更新、删除。在DataMapper里执行这些操作很容易。编辑另一个脚本例如crud.rb,输入:
song = Song.new song.title = "My Way" song.lyrics = "And now the end is near ... " song.length = 435 song.released_on = Date.new(1969) song.save
执行这个脚本2次,在SQLite数据库里看到:
sqlite> select * from songs; 1|My Way|And now the end is near ... |435|1969-01-01 2|My Way|And now the end is near ... |435|1969-01-01
现在读取数据:
puts Song.count # 打印记录数 records = Song.all # 所有记录对象以数组返回 puts records.first.title # 得到第一个记录的title字段的内容
上面这句也可以直接调用类方法:
puts Song.first.title
如果想查找一首title为My Way的歌,使用如下方法:
myway = Song.first(title: "My Way")
得到这首歌的长度(length字段):
myway.length
修改它的长度:
myway.update(length: 275)
上面将这首歌的length修改为275.
删除记录调用destroy方法,例如删除最后一行:
Song.last.destroy
删除length为65的行:
Song.first(length: 65).destroy
基本的CRUD就介绍到这里,更详细用法可以参考Ruby DataMapper官网。