nodejs-ORM 操作数据库中间件waterline的使用
Posted 晓晨Master
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs-ORM 操作数据库中间件waterline的使用相关的知识,希望对你有一定的参考价值。
waterline和Sails.js同一团队开发,支持几乎所有的主流数据库,是nodejs下一款非常强大的orm,可以显著提升开发效率
一.waterline支持的数据库
二.waterline的配置
Waterline 之所以可以使用一样的代码来操作多种数据库,奥妙在于其适配器。在进行配置的时候,需要设置两方面的内容,一是具体使用哪些适配器,二是建立数据库连接的时候,使用哪个适配器。下面是使用 MongoDB/mysql 的适配器创建一个数据库连接的配置
MongoDB:
1 var mongoAdapter = require(\'sails-mongo\'); 2 var wlconfig = { 3 adapters: { 4 \'default\': mongoAdapter, 5 \'mongo\': mongoAdapter 6 }, 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,如下图
4.waterline会自动根据定义的model创建表,但是如果你已经创建好了表,但是与model定义有所区别,比如字段名不一样,那么一定要注意了,请按照下图设置,否则waterline将会删除已经存在表且根据model重新创建,以前的数据就完蛋了
四.校验器
校验器是在创建数据集合的时候指定给具体的属性的
更多设置请查看: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 new Date(); 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) return cb(err); 7 8 values.password = password; 9 cb(); 10 }); 11 },
六.查询方法
waterline有以下查询方法
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 return comments; 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 = new Waterline(); 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写爬虫,欢迎关注!
以上是关于nodejs-ORM 操作数据库中间件waterline的使用的主要内容,如果未能解决你的问题,请参考以下文章