waterline和Sails.js同一团队开发,支持几乎所有的主流数据库,是nodejs下一款非常强大的orm,可以显著提升开发效率

一.waterline支持的数据库

二.waterline的配置

Waterline 之所以可以使用一样的代码来操作多种数据库,奥妙在于其适配器。在进行配置的时候,需要设置两方面的内容,一是具体使用哪些适配器,二是建立数据库连接的时候,使用哪个适配器。下面是使用 MongoDB/Mysql 的适配器创建一个数据库连接的配置

MongoDB:

 var mongoAdapter = require('sails-mongo');
var wlconfig = {
adapters: {
'default': mongoAdapter,
'mongo': mongoAdapter
},
connections: {
'mongo': {
// adapters 中的适配器代码
adapter: 'mongo',
url: 'mongodb://localhost/waterline-sample'
}
}
};
sails-mongo 为mongo的适配器,执行命令安装:
npm i sails-mongo --save

Mysql:

 var mysqlAdapter = require('sails-mysql');
var Waterline = require('waterline'); var icbcgold = require('../models/IcbcGold') //适配器与连接设置
var wlconfig = {
adapters: {
mysql: mysqlAdapter, //mysql适配器
default: 'mysql' //默认的适配器
},
connections: {
//mysql连接
mysql: {
adapter: 'mysql',//指定适配器为mysql
url: 'mysql://root:@localhost/IcbcGold' //连接字符串
}
}
}
sails-mysql 为mysql适配器,执行命令安装:
 npm i sails-mysql --save

连接字符串说明:数据库类型://用户名:密码@数据库地址/数据库名

三.waterline的Model的定义

执行命令安装waterline:

npm i waterline --save
 var Waterline = require('waterline');

 module.exports = Waterline.Collection.extend({
identity: 'icbcgold', //模型名,如果没有设置 tableName 属性,那么waterline默认将模型名设置为表名
tableName: 'tb_IcbcGold',//指定表名
connection: 'mysql',//指定数据库连接
// 是否强制模式
schema: false,
attributes: {
Id: {
type: 'string',
primaryKey: true
},
DataTime: {
type: 'datetime'
},
DataNumber: {
type: 'float'
}
}
});

配置相当简单方便,类似于 Mongoose 中的 Schema。但要注意,指定属性的字段时,使用的是一个字符串值,而不是 JavaScript 中的具体类型,目前支持的数据类型有 string / text / integer / float / date /time / datetime / boolean / binary / array / json,这个范围要比 JavaScript 的类型范围大。

除了这四个基本配置,还可以配置校验器,添加自定义的方法,设置生命周期回调方法等。

注意:

  1.如果没有定义主键,那么waterline会为你默认创建名为id的主键,类型是整型自增长

  2.waterline自动创建表时会为你添加 createdAt、updatedAt两个字段,类型为datetime,分别在insert和update操作更新字段代表的是记录的创建时间和更新时间

  3.如果不想自动创建列createdAt、updatedAt,那么请设置autoCreatedAt,autoUpdatedAt的值为false,如下图

  

  4.waterline会自动根据定义的model创建表,但是如果你已经创建好了表,但是与model定义有所区别,比如字段名不一样,那么一定要注意了,请按照下图设置,否则waterline将会删除已经存在表且根据model重新创建,以前的数据就完蛋了

  

 

四.校验器

校验器是在创建数据集合的时候指定给具体的属性的

更多设置请查看:https://www.npmjs.com/package/waterline

 attributes: {
title: {
type: 'string',
required: true,//必须的字段
maxLength: 100,//最大长度100
minLength: 5 //最小长度5
},
views: {
type: 'integer',
min: 0
},
createTime: {
type: 'date',
// 在某个时间点之前
before: '2017-12-31',
// 在某个时间点之后
after: function () {
return new Date();
}
}
}

五.生命周期回调

可以通过waterline,来实现在进行特定操作的时候,调用自定义的方法。,在 create / update / destory时,均有多种回调。直接提供对应的方法名,分别是:

  • 创建时:beforeValidate / afterValidate / beforeCreate / afterCreate
  • 更新时:beforeValidate / afterValidate / beforeUpdate / afterUpdate
  • 删除时:beforeDestroy / afterDestroy

这些方法,需要在初始化数据集合的时候进行定义。

 //values值 cb回调方法
beforeCreate: function(values, cb) { // 加密password字段的值
encrypt(values.password, function(err, password) {
if(err) return cb(err); values.password = password;
cb();
});
},

六.查询方法

waterline有以下查询方法

1.查询 name 等于 foo 的记录

Model.find({ name: 'foo' })

2.多条件查询 查询 name 等于 water 并且 state 等于new mexico 的记录

 Model.find({ name: 'walter', state: 'new mexico' })
User.find()
.where({ id: { '>': 100 }})
.where({ age: 21 })
.limit(100)
.sort('name')
.exec(function(err, users) {
// Do stuff here
});

下面的修饰符可用于构建查询时使用。

  • '<' / '小于'
  • '<=' / '小于等于'
  • '>' / '大于'
  • '>=' / '大于等于'
  • '!' / '非'
  • 'like'/'模糊匹配'
  • 'contains'/'包含'
  • 'startsWith'/'以某字符开头'
  • 'endsWith'/'以某字符结尾'

3.分页查询

 User.find().skip(10).limit(10); //跳过10条记录 取10条记录
 Model.find({ where: { name: 'foo' }, skip: 20, limit: 10, sort: 'name DESC' });//带条件分页查询
User.find().paginate({page: 2, limit: 10});//根据页数分页查询

4.新增记录

User.create({Id:'xxx',Name:'xxx'});

5.更新记录

User.update({ name: 'Walter Jr' }, { name: 'Flynn' })

6.删除记录

User.destroy({ name: 'Flynn' })

Promises

 User.findOne()
.where({ id: 2 })
.then(function(user){
var comments = Comment.find({userId: user.id}).then(function(comments){
return comments;
});
return [user.id, user.friendsList, comments];
}).spread(function(userId, friendsList, comments){
// Promises are awesome!
}).catch(function(err){
// An error occurred
})

七.使用示例

这里使用的数据库是mysql创建一个数据库名为:IcbcGold

1.新建一个js文件:waterline.js,代码如下:

 var mysqlAdapter = require('sails-mysql');
var Waterline = require('waterline'); var icbcgold = require('../models/IcbcGold') //适配器与连接设置
var wlconfig = {
adapters: {
mysql: mysqlAdapter, //mysql适配器
default: 'mysql' //默认的适配器
},
connections: {
//mysql连接
mysql: {
adapter: 'mysql',//指定适配器为mysql
url: 'mysql://root:@localhost/IcbcGold' //连接字符串
}
}
} var orm = new Waterline(); //加载model集合
orm.loadCollection(icbcgold); exports.orm = orm;
exports.wlconfig = wlconfig;

2.新建文件 index.js

var waterline = require('./app/config/waterline');
var uuid = require('uuid'); var ormmodels = null; //初始化waterline
waterline.orm.initialize(waterline.wlconfig, function (err, models) {
if (err) {
return;
}
ormmodels = models.collections;
})
//执行查询
ormmodels.icbcgold.count({ DataTime: dataTime }).exec(function (err, found) {
if (err) {
return;
}
if (found === 0) {
ormmodels.icbcgold.create({ Id: uuid.v1(), DataTime: dataTime, DataNumber: dataNumber }, function (err, models) {
if (err) {
return;
}
});
}
});

呼~~~~终于写完了,下面帖几个网址,如果你有什么问题可以先查看

http://sailsjs.com/documentation/reference/waterline-orm/models

https://www.npmjs.com/package/waterline

waterline使用是非常简单的,目前用nodejs写了一个爬虫,使用waterline存储数据到mysql,已经部署到服务器上,使用pm2运行,抓取数据用的是superagent,后面我会继续写如果用nodejs写爬虫,欢迎关注!

nodejs-ORM 操作数据库中间件waterline的使用的更多相关文章

  1. laravel使用ORM操作数据库

    laravel使用ORM操作数据库 public function mode(){ //查询所有 $isok=Student::get(); 新增. (1) $isok=Student::create ...

  2. nodejs mysql 操作数据库方法二

    node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选, ...

  3. DjangoMTV模型之model层——ORM操作数据库(基本增删改查)

    Django的数据库相关操作 对象关系映射(英语:(Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说 ...

  4. django 通过orm操作数据库

    Django Model 每一个Django Model都继承自django.db.models.Model 在Model当中每一个属性attribute都代表一个database field 通过D ...

  5. 在nodejs中操作数据库(MongoDB和MySQL为例)

    一.使用nodejs操作MongoDB数据库 ①使用官方的mongodb包来操作 ②使用第三方的mongoose包来操作(比较常用) // 首先必须使MongoDB数据库保持开启状态 // npm下载 ...

  6. Python Django orm操作数据库笔记之QuerySet API

    什么时候Django会将QuerySet转换为SQL去执行: 根据Django的数据库机制,对于QuerySet来说,当QuerySet被第一次构建,然后又调用他的filter方法,接着在对其进行切片 ...

  7. Python Django orm操作数据库笔记之外键和表关系

    外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的. 外键的使用 使用外键前需要先确保相应外键已存储在数据库中(flask中 ...

  8. nodejs mysql 操作数据库方法一详解

    nodejs mysql 数据查询例子 时间 2014-11-11 15:28:01  姜糖水原文  http://www.cnphp6.com/archives/59864 1.安装nodejs 2 ...

  9. Django ORM操作数据库常用API

    昨天晚上,我们完成了一个简单的实例来对数据库表进行操作.今天,我们要熟悉更多的API,实现更复杂的功能.这一步完成了,我们对小型数据的操作问题也就不大了. 现在,我们还是参考django官方文档,来进 ...

随机推荐

  1. 使用HAL库函数建立STM32F2工程

    一.建立一个新的文件夹,新建三个文件夹User.Driver.Project,还可以加一个Doc存放工程的相关说明等等. 1.将STM32F2xx的库函数(HAL函数库)中的Drivers文件夹中的所 ...

  2. 使用React改版网站后的一些感想

    文章转载:http://www.jianshu.com/p/8f74cfb146f7 网站是毕业设计的作品,开发这个网站的目的主要用于记录一些笔记,以及聚合一些资讯信息,也算自己在网络世界中的一块静地 ...

  3. Akka(7): FSM:通过状态变化来转换运算行为

    在上篇讨论里我们提到了become/unbecome.由于它们本质上是堆栈操作,所以只能在较少的状态切换下才能保证堆栈操作的协调及维持程序的清晰逻辑.对于比较复杂的程序流程,Akka提供了FSM:一种 ...

  4. VR全景智慧城市常诚:信息技术点亮“智慧城市”

    亚太城市峰会暨市长论坛日前在澳大利亚昆士兰州首府布里斯班举行,"智慧城市"成为焦点议题.来自135个国家和地区的市长.副市长及代表们共同讨论如何利用高新科技解决城市发展中的问题,让 ...

  5. DISCUZ积分及点评需求

    1.点评设置(可增强用户互动,但又不会顶帖刷屏):目前很难限制用户通过点评刷积分,点评等同于回复但却不需要审核,目前只是简单地关闭了点评功能.需求:可以审核点评内容:可以限制点评不获得积分或每天点评获 ...

  6. [POJ 2115} C Looooops 题解(扩展欧几里德)

    题目描述 对于C的for(i=A ; i!=B ;i +=C)循环语句,给出A,B,C和k(k表示变量是在k进制下的无符号整数),判断循环次数,不能终止输出"FOREVER". 输 ...

  7. jquery.qrcode.min.js(支持中文转化二维码)

    详情请看:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/jqueryqrcodeminjs/ 今天还是要讲一下关于二维码的知识,前 ...

  8. CSS3 @keyframes 规则

    今天来给大家分享一下CSS3 @keyframes 规则! 在你了解CSS3 @keyframes 规则时我先来给大家说说什么是css3中的动画 动画是使元素从一种样式逐渐变化为另一种样式的效果. 您 ...

  9. .net 4.0 中的特性总结(五):并行编程

    1.任务并行库 从 .NET Framework 4 开始,TPL 是编写多线程代码和并行代码的首选方法. 但是,并不是所有代码都适合并行化:例如,如果某个循环在每次迭代时只执行少量工作,或它在很多次 ...

  10. GitHub:多人协作下的分支处理

    GitHub上的团队协作 远程信息 git remote:查看远程库的信息 git remote -v:查看远程库的详细信息 推送分支 git push origin 要推送的分支:比如git pus ...