sails 框架下的 orm 实现 - Waterline
文章目录
上一篇介绍了 使用sails框架快速搭建项目
今天和大家分享 sails 另外一个重要的功能模块:
sails的ORM实现
什么是ORM
Java 中的 Hibernate 框架的一个重要功能便是将数据库中的数据与 Java 中的对象进行映射,被称为 ORM (Object Relational Mapping),
Node.js 里常用的 Mongoose ,便是将 MongoDB 的文档,映射为 JavaScript 的对象,
而 Waterline 可以看做是一个支持多种数据库的 Mongoose ,使得可以用一样的代码来实现对多种数据库的操作,无论是关系数据库还是文档数据库,都可以直接使用对象的方法来进行增删改查操作
著名的 Sails 开发团队Balderdash,开发了一套ORM框架:Waterline .
Waterline
在 sails 框架下
/api/models目录里定义的模型文件,由Waterline驱动,所有model都能全局访问, 当Sails启动的时候,都要经由Waterline的洗礼.
Waterline 是通过Adapter关联不同的数据库, (不同的数据库由不同的 Adapter 来关联)
Waterline 目前适配世面上大部分数据库.
一类是官方团队开发
- PostgreSQL
- MySQL
- MongoDB
- Redis
- Disk
- Memory
一类是民间开发者开发
- SQLServer
- OrientDB
- Oracle
- Cassandra
Waterline 的功能特点
- 广泛的数据库支持:支持世面上能见到的主流关系数据库和文档数据库 (如上列表)
- 摆脱SQL :对于习惯了使用 Mongoose 的程序员,如果要去使用 SQL 操作关系数据库,肯定会有点不适应, Waterline 可以像 Mongoose 一样使用对象的方法来实现关系数据库的操作
- 屏蔽不同数据库的差别:对于大部分情况下,你根本不用关心操作的是 MySQL 还是 MongoDB。比如 MongoDB 中并没有数字自增(Auto Increment)的功能,但 Waterline 使用 autoPK 来为 MongoDB 实现了自增
- 易于理解的符号:在 Mongoose 中,大于和小于得使用 $gt / $lt 来表示,而 Waterline 里,直接使用 > / < 即可
- 多样的操作支持:提供了 26 种方法来进行增删改查操作
- 丰富的数据类型:支持 JavaScipt 中除了对象外的所有数据类型,还额外提供了日期、时间、二进制、JSON的支持,数字还可以区分整数和浮点数
Waterline 中的models
Waterline 中负责具体与表和集合对应的是数据集合 Collection,它有点类似于 Mongoose 中的 Model,但在 Waterline 中,所有的数据集合合在一起,加上一些其它的属性和方法,构成一整个 models .
数据集合在初始化的时候,需要指定使用哪些连接,是否强制模式,具有哪些属性以及集合的 id,如下:
var Post = Waterline.Collection.extend({
// 集合的 id
identity: 'post',
// 使用的连接数
connection: 'mongo',
// 是否强制模式
schema: true,
attributes: {
title: {
type: 'string',
required: true
},
content: 'string',
createTime: 'date',
lastModifyTime: 'date'
}
});
指定属性的字段时,使用的是一个字符串值,而不是 JavaScript 中的具体类型,
目前支持的数据类型有 string / text / integer / float / date / time / datetime / boolean / binary / array / json
校验器
校验器是在创建数据集合的时候指定给具体的属性的,除了预定义的校验器,还可以自定义校验器.
预定义的校验器涵盖了 Mongoose 中的必须字段验证、字符串长度验证等。比如下面这几种:
attributes: {
title: {
type: 'string',
required: true, //必填
maxLength: 100, //最大长度
minLength: 5 //最小长度
},
views: {
type: 'integer',
min: 0 //最小值
}
createTime: {
type: 'date',
// 在某个时间点之前
before: '2016-12-31',
// 在某个时间点之后 (当前时间之后)
after: function(){
return new Date();
}
}
}
除了上面这几个简单的,Anchor 支持的验证器 还有针对时间、地理位置、正则表达式、布尔值、Email地址的,一共有 20 多个.