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

本文涉及的产品
云原生网关 MSE Higress,422元/月
性能测试 PTS,5000VUM额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介:

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',//指定适配器为mysql16             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: true13         },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: 011         },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',//指定适配器为mysql16             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;//初始化waterlinewaterline.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;
                }
            });
        }
    });

本文转自  zddnd   51CTO博客,原文链接:http://blog.51cto.com/13013666/1949242
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
2月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第36天】在探索Node.js的奥秘之旅中,中间件的概念如同魔法一般,它让复杂的请求处理变得优雅而高效。本文将带你领略这一机制的魅力,从概念到实践,一步步揭示如何利用中间件简化和增强你的应用。
|
8月前
|
开发框架 JavaScript 中间件
中间件应用Koa.js(Node.js)
【5月更文挑战第3天】我们添加了两个中间件。第一个中间件记录请求的开始时间,并在下一个中间件执行完毕后计算并打印出请求的总时间。第二个中间件与之前的示例相同,它设置响应体为 "Hello World"
65 6
中间件应用Koa.js(Node.js)
|
2月前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
2月前
|
消息中间件 JavaScript 中间件
深入浅出Node.js中间件机制
【10月更文挑战第24天】在Node.js的世界里,中间件如同厨房中的调料,为后端服务增添风味。本文将带你走进Node.js的中间件机制,从基础概念到实际应用,一探究竟。通过生动的比喻和直观的代码示例,我们将一起解锁中间件的奥秘,让你轻松成为后端料理高手。
46 1
|
7月前
|
缓存 负载均衡 监控
探秘数据库中间件:ProxySQL与MaxScale的优势与劣势
探秘数据库中间件:ProxySQL与MaxScale的优势与劣势
254 2
|
3月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
3月前
|
JSON JavaScript 中间件
深入浅出Node.js中间件机制
本文将带你探索Node.js中一个核心概念——中间件机制。我们将通过浅显的语言和生动的比喻,揭示中间件如何作为请求和响应之间的“交通枢纽”,在应用程序中起到至关重要的作用。从基础原理到实际应用,你将了解到中间件不仅简化了代码结构,还提高了开发效率,是Node.js开发不可或缺的一部分。
64 1
|
4月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
54 0
Node服务连接Mysql数据库
|
3月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第4天】在探索Node.js的海洋中,中间件机制犹如一座灯塔,为开发者指引方向。本文将带你一探究竟,从浅入深地理解这一核心概念。我们将通过生动的比喻和实际代码示例,揭示中间件如何在请求和响应之间搭建桥梁,实现功能的扩展与定制。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
66 0