sails 框架下的 orm 实现 - Waterline

sails.png

上一篇介绍了 使用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 多个.

出自:sails 框架下的 orm 实现 - Waterline



回到顶部