node.js Sequelize实现单实例字段或批量自增、自减


Posted in Javascript onDecember 08, 2016

一、单实例自增、自减

在Sequelize中,一个实例(Instance)表示数据库中的一行记录。Instance有两种:由Model.build()创建的非持久化实例,和由Model.create()等方法创建的持久化实例。无论是持久化还是非持久化实例,都会有increment()decrement()两人上方法,分别用于字段值的自增和自减两种操作。

  1. instance.increment(fields, [options]) - 字段值自增
  2. instance.decrement(fields, [options]) - 字段值自减

如,查找id为1的用户,并将其年龄自增1:

var User = sequelize.import('../lib/model/user/user');
User.findById(1).then(function(user){
 user.increment('age').then(function(user){
 console.log('success');
 })
})

其中increment()方法生成的SQL语句如下:

UPDATE `user` SET `age`=`age` + 1 WHERE `id` = 1

increment()decrement()默认的自增、自减值是1。如果希望使用其它值,可在选项参数[options]中通过by参数指定。

如,将用户的number、age两个字段减小2,可以通过以下方式实现:

user.increment(['age', 'number'], {by:2}).then(function(user){
 console.log('success');
})

生成的SQL如下:

UPDATE `user` SET `age`=`age` + 2,`number`=`number` + 2 WHERE `id` = 1

fields参数还可以通过对象传入,并指定自增、自减值。这种情况下,会忽略options.by参数。

如,将用户的number增加2、age减小1:

user.increment({age:-1, number:2}, {by:5}).then(function(user){
 console.log('success');
})

生成的SQL如下:

UPDATE `user` SET `age`=`age` + -1,`number`=`number` + 2 WHERE `id` = 1

二、 批量自增、自减

increment()decrement()都是针对单个实例进行自增或自减操作的,也就是说操作的数据为数据库中的一行数据。要实现类似如下批量自增、自减操作,就无法通过Instance操作:

UPDATE `user` SET `age`=`age` + 1 WHERE `number` > 10;

在Sequelize中,指量操作一般是通过模型(Model)来实现。但Model并没有increment()decrement()方法,无法像Instance那样方便的进行自增或自减。

这时,我们可以通过Model.update()并借助sequelize中的顶级方法sequelize.literal()来实现:

sequelize.literal(val) - 创建字面量对象

sequelize.literal()方法用于创建一个字面量对象,该对象(val)会被直接传入所生成的SQL语句中,而不会进行任何转义。

如,将number大于10的用户年龄增加1:

User.update({sex:sequelize.literal('`age` +1')}, {where:{number:{$gt:10}}}).then(function(user){
 console.log('success');
})

生成的SQL语句如下:

UPDATE `user` SET `age`=`age` +1 WHERE `number` > 10

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jQuery与ExtJS之选择实例分析
Aug 19 Javascript
用jquery修复在iframe下的页面锚点失效问题
Aug 22 Javascript
jquery实现鼠标滑过显示提示框的方法
Feb 05 Javascript
javascript实现控制浏览器全屏
Mar 30 Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
基于JS实现textarea中获取动态剩余字数的方法
May 25 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
Jun 25 Javascript
用jQuery的AJax实现异步访问、异步加载
Nov 02 Javascript
如何使用JS在HTML中自定义字符串格式化
Jul 20 Javascript
node下使用UglifyJS压缩合并JS文件的方法
Mar 07 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
Mar 04 Javascript
Vue.JS入门教程之自定义指令
Dec 08 #Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
Dec 08 #Javascript
node.js学习之交互式解释器REPL详解
Dec 08 #Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
Dec 08 #Javascript
JS中用childNodes获取子元素换行会产生一个子元素
Dec 08 #Javascript
微信公众号 摇一摇周边功能开发
Dec 08 #Javascript
Vue概念及常见命令介绍(1)
Dec 08 #Javascript
You might like
来自PHP.NET的入门教程
2006/10/09 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
js使用generator函数同步执行ajax任务
2017/09/05 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
python线程、进程和协程详解
2016/07/19 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
python处理按钮消息的实例详解
2017/07/11 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
基于pip install django失败时的解决方法
2018/06/12 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
Python多进程原理与用法分析
2018/08/21 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
介绍一下MD5加密算法
2016/11/12 面试题
研究生自荐信
2013/10/09 职场文书
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
请假条范文大全
2014/04/10 职场文书
七夕情人节促销方案
2014/06/07 职场文书
简单租房协议书范本
2014/08/20 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
委托公证书样本
2015/01/23 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书