waterline mysql_nodejs-ORM 操作数据库中间件waterline的使用

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

一.waterline支持的数据库

1d7201fd7c6e5d403655cde945aa1f9e.png

二.waterline的配置

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

MongoDB:

1 var mongoAdapter = require('sails-mongo');2 var wlconfig ={3 adapters: {4 'default': mongoAdapter,5 'mongo': mongoAdapter6 },7 connections: {8 'mongo': {9 //adapters 中的适配器代码

10 adapter: 'mongo',11 url: 'mongodb://localhost/waterline-sample'

12 }13 }14 };

sails-mongo 为mongo的适配器,执行命令安装:

npm i sails-mongo --save

Mysql:

1 var mysqlAdapter = require('sails-mysql');2 var Waterline = require('waterline');3

4 var icbcgold = require('../models/IcbcGold')5

6 //适配器与连接设置

7 var wlconfig ={8 adapters: {9 mysql: mysqlAdapter, //mysql适配器

10 default: 'mysql' //默认的适配器

11 },12 connections: {13 //mysql连接

14 mysql: {15 adapter: 'mysql',//指定适配器为mysql

16 url: 'mysql://root:@localhost/IcbcGold' //连接字符串

17 }18 }19 }

sails-mysql 为mysql适配器,执行命令安装:

1 npm i sails-mysql --save

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

三.waterline的Model的定义

执行命令安装waterline:

npm i waterline --save

1 var Waterline = require('waterline');2

3 module.exports =Waterline.Collection.extend({4 identity: 'icbcgold', //模型名,如果没有设置 tableName 属性,那么waterline默认将模型名设置为表名

5 tableName: 'tb_IcbcGold',//指定表名

6 connection: 'mysql',//指定数据库连接

7 //是否强制模式

8 schema: false,9 attributes: {10 Id: {11 type: 'string',12 primaryKey: true

13 },14 DataTime: {15 type: 'datetime'

16 },17 DataNumber: {18 type: 'float'

19 }20 }21 });

配置相当简单方便,类似于 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,如下图

c2116ea85bddc03120034e92c6e7cbaf.png

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

3bc24b759381f8d4b8542eec2f386d94.png

四.校验器

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

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

1 attributes: {2 title: {3 type: 'string',4 required: true,//必须的字段

5 maxLength: 100,//最大长度100

6 minLength: 5 //最小长度5

7 },8 views: {9 type: 'integer',10 min: 0

11 },12 createTime: {13 type: 'date',14 //在某个时间点之前

15 before: '2017-12-31',16 //在某个时间点之后

17 after: function() {18 return newDate();19 }20 }21 }

五.生命周期回调

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

创建时:beforeValidate / afterValidate / beforeCreate / afterCreate

更新时:beforeValidate / afterValidate / beforeUpdate / afterUpdate

删除时:beforeDestroy / afterDestroy

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

1 //values值 cb回调方法

2 beforeCreate: function(values, cb) {3

4 //加密password字段的值

5 encrypt(values.password, function(err, password) {6 if(err) returncb(err);7

8 values.password =password;9 cb();10 });11 },

六.查询方法

waterline有以下查询方法

444cd855bf089643c3b3482dfa28784a.png

1.查询 name 等于 foo 的记录

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

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

1 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.分页查询

1 User.find().skip(10).limit(10); //跳过10条记录 取10条记录

1 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

1 User.findOne()2 .where({ id: 2})3 .then(function(user){4 var comments = Comment.find({userId: user.id}).then(function(comments){5 returncomments;6 });7 return[user.id, user.friendsList, comments];8 }).spread(function(userId, friendsList, comments){9 //Promises are awesome!

10 }).catch(function(err){11 //An error occurred

12 })

七.使用示例

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

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

1 var mysqlAdapter = require('sails-mysql');2 var Waterline = require('waterline');3

4 var icbcgold = require('../models/IcbcGold')5

6 //适配器与连接设置

7 var wlconfig ={8 adapters: {9 mysql: mysqlAdapter, //mysql适配器

10 default: 'mysql' //默认的适配器

11 },12 connections: {13 //mysql连接

14 mysql: {15 adapter: 'mysql',//指定适配器为mysql

16 url: 'mysql://root:@localhost/IcbcGold' //连接字符串

17 }18 }19 }20

21 var orm = newWaterline();22

23 //加载model集合

24 orm.loadCollection(icbcgold);25

26 exports.orm =orm;27 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写爬虫,欢迎关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值