server.js文件
const dao = require("../dao/user.dao");
saveDat是个对象自己处理一下
if (updataFlag) {//编辑角色
result = await dao.roleUpdata(saveDta);
} else {//新增角色
saveDta.role.create_name = user.name;
saveDta.role.code = need.code;
result = await dao.roleAdd(saveDta);
} return result;

编辑角色

dao文件就是上面引入的文件 
roleUpdata(need) {
     const dcMeun = "表名"
      let list = [];//编辑过来的先删除库里面的按角色code删除所有
let roleProductMap = db.remove(dcMeun, {
role_code: need.code
}, true)
list.push({
sql: roleProductMap.sql,
param: roleProductMap.param
})
//如果有选择产品 往库里面批量增加
if (Array.isArray(need.products) && need.products.length > 0) {
let addProduct = db.bulkCreate(dcMeun, need.products, true)
list.push({
sql: addProduct.sql,
param: addProduct.param
})
}
return db.execTransaction(list);
},

    /**
     * 批量增加数据
     * @param table 表名
     * @param moduleBean 要添加的字段 [ {字段名:字段值}]
     * 例:db.bulkCreate(tableName, [{id:'12', name:'jerry'}, {id:'115', name:'hou'}]);
     */
    bulkCreate(table, moduleBean, isConfig) {
      let attributes = new Set();
      let values = [];
      moduleBean.forEach(ele => {
        let value = [];
        for (var key in ele) {
          attributes.add(key);
          value.push(ele[key]);
        }
        values.push(value);
      });
      var _sql = `INSERT INTO ${table}(${Array.from(attributes).join(',')}) VALUES ? `;
      if (isConfig) {
        return {
          sql: _sql,
          param: [values]
        }
      } else {
        return this.execSql(_sql, [values]);
      }
    },
   /**
     *  自定义 SQL 语句
     * 【注】表名一定要用??两个问号
     */
    execSql(sql, values, field = false) {
      return new Promise((resolve, reject) => {
        pool.getConnection(function (err, connection) {
          if (err) {
            connection && connection.release();
            reject(err);
          } else {
            var query = connection.query(sql, values, (err, rows, fields) => {
              connection.release();
              if (err) {
                reject(err);
                process.logger.error("SQL Error:[", err, "]");
              } else {
                if (field) {
                  resolve({
                    data: rows,
                    fields: fields
                  });
                } else {
                  resolve(rows);
                }
              }
            });
            process.logger.trace("Current Exec SQL:[", query.sql, "]");
          }
        });
      });
    },
  /**
    * 开启事务处理
    * @param sqlParamList sql语句和参数对象数组
    例:
    db.execTransaction([{
      sql: "INSERT INTO ?? SET?",
      param : [table, entity],
      callback: function(result){
      //执行成功回调
      console.log(result);
    }
    },{
      sql: "INSERT INTO ?? SET email=?",
      param : [table, 'lixia@goinni.com'],
      callback: function(result){
      console.log(result);
      }
    },{
      sql: "INSERT INTO ?? SET email=?",
      param : [table, 'limeizhen@goinni.com']
    }]);
    */
    execTransaction(sqlParamList) {
      return new Promise((resolve, reject) => {
        pool.getConnection(function (err, connection) {
          if (err) {
            resolve(err);
          } else {
            connection.beginTransaction(function (err) {
              if (err) {
                reject(err);
                connection.release();
                //throw err;
              }
              var n = 0,
                res = [];
              // 递归处理多条 SQL 语句
              function ac(sqlParamList) {
                var item = sqlParamList[n];
                var qr = connection.query(item.sql, item.param, function (error, results, fields) {
                  res.push(results); //缓存结果,统一返回
                  if (error) {
                    return connection.rollback(function () {
                      //throw error;
                      reject(error);
                      connection.release();
                    });
                  }
                  process.logger.trace(`Current Exec SQL:[${qr.sql}]`);
                  if (n === sqlParamList.length - 1) {
                    // 最后统一提交
                    connection.commit(function (err) {
                      if (err) {
                        return connection.rollback(function () {
                          //throw err;
                          reject(err);
                          connection.release();
                        });
                      }
                      resolve(res);
                      connection.release();
                      process.logger.info('Transaction Success!');
                    });
                  } else {
                    n++;
                    //将结果回传给当前方法,方便后续使用
                    item.callback && item.callback(results);
                    //递归
                    ac(sqlParamList);
                  }
                });
              }
              ac(sqlParamList);
            });
          }
        });
      });
    },
 

新增角色

   roleAdd(need) {
let list = [];
//新增就直接批量增加了
if (Array.isArray(need.products) && need.products.length > 0) {
let productAdd = db.bulkCreate(dcMeun, need.products, true)
list.push({
sql: productAdd.sql,
param: productAdd.param
})
}
return db.execTransaction(list);
},
里面的bulkCreate和execTransaction函数都和上面编辑的一模一样

记录nodejs做编辑和新增时候对数据库的操作的更多相关文章

  1. Git学习记录 力做全网最强入门教程

    目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...

  2. PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)

    (转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...

  3. nodejs 做后台的一个完整业务整理

    大家知道js现在不仅仅可以写前端界面而且可以写后端的业务了,这样js就可以写一个全栈的项目.这里介绍一个nodejs + express + mongodb + bootstap 的全栈项目. 1.安 ...

  4. Nodejs做整站转发

    刚接触nodejs,做个东西练下手,通过nodejs直接转发整站,原本想把内容全翻译成英文,但google对流量行审查,被封IP,所以就没啥用了, 效果像这样 var b = function (a, ...

  5. windows下百度离线人脸识别本地部署与使用(nodejs做客户端,c++做服务端,socket做通信)

    1.离线人脸识别本地部署 详情请阅读百度人脸识别官网 2.nodejs做socket通信的客户端 为什么不直接通过调用c++编译的exe获得人脸识别结果? 原因:exe运行时会加载很多模型而消耗很多时 ...

  6. vue编辑、新增弹框(引用外部页面)

    vue编辑.新增弹框(引用外部页面) 2018年06月15日 09:37:20 会飞的猪biubiu 阅读数 10265    版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  7. 跟我一起学extjs5(18--模块的新增、改动、删除操作)

    跟我一起学extjs5(18--模块的新增.改动.删除操作)         上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...

  8. SSM Mybatis将新增数据写入数据库时出现的500状态码:Error updating database.的可能

    关于maven下ssm整合的项目推荐这篇博客:https://www.cnblogs.com/yiye/p/5969157.html 今日在ssm下的将新增数据写回数据库时遇到不少的问题,现作记录 如 ...

  9. SQLSERVER数据库备份操作和还原操作做了什么

    SQLSERVER数据库备份操作和还原操作做了什么 看了这篇文章:还原/备份时做了些什么 自己也测试了一下,下面说的错误日志指的是SQLSERVER ERRORLOG 一般在C:\Program Fi ...

  10. 记录CentOS7.X版本下安装MySQL5.7数据库

    记录CentOS7.X版本下安装MySQL5.7数据库  设置rpm下载目录在/opt目录下新建一个目录存放mysql cd /opt sudo mkdir mysql12  下载MySQL的源 wg ...

随机推荐

  1. 【数学】向量点乘、叉乘的理论、应用及代码实现(C++)

    前言 我总结了一下向量点乘,叉乘的概念,以及他们的应用及相关C++代码的实现.blog 这类问题也是技术面试经常碰到的,一次研究透了会有收获. 1 向量 向量具有大小和方向. 共线向量:两个平行的向量 ...

  2. 力扣1098(MySQL)-小众书籍(中等)

    题目: 书籍表 Books: book_id 是这个表的主键 订单表 Orders: order_id 是这个表的主键.book_id 是 Books 表的外键. 问题你需要写一段 SQL 命令,筛选 ...

  3. 力扣238(java)-除自身以外数组的乘积(中等)

    题目: 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 . 题目数据 保证 数组 nums之中任意元素的全 ...

  4. 牛客网-SQL专项训练3

    ①这里有一张user表包含如下信息: 现在要把name列的所有值都转换为大写,并将字段重命名为names,像下面这样: SQL语句为:SELECT UCASE(name) AS names FROM ...

  5. 网不好怎么办?TLS握手带宽直降80%,BabaSSL是怎么做到的?| 龙蜥技术

    ​简介:为了保障数据的安全性,客户端会先和服务器进行 TLS 握手,有什么办法可以减少 TLS 握手的带宽消耗呢? 编者按:BabaSSL 是一款开源的密码库产品,在 GitHub 和龙蜥社区开源,并 ...

  6. Quick BI V4.0功能“炸弹”来袭,重磅推出即席分析、模板市场、企业微信免密登录等强势功能

    简介: 2021年7月,Quick BI公共云版本迭代新功能:重磅推出即席分析.模板市场,分析门槛再降低:推出企业微信无缝对接,移动端类目个性配置及管理提升多端能力:数据建模配置交互升级至拖拽模式提升 ...

  7. GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性

    假设有一个捣蛋的小伙伴加入了你的团队,这个捣蛋的小伙伴喜欢乱改代码,请问此时的单元测试能否拦住这些逗比行为?如果不能拦住逗比行为,是否代表着单元测试有所欠缺,或者有某些分支逻辑没有考虑到.本文将告诉大 ...

  8. 9.按需创建PV和PVC并使用

    官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-stor ...

  9. 数据可视化之matplotlib模块

    一.简介 Matplotlib是一个强大的Python绘图和数据可视化的工具包.数据可视化也是我们数据分析的最重要的工作之一,可以帮助我们完成很多操作,例如:找出异常值.必要的一些数据转换等.完成数据 ...

  10. ITIL一定要去认证吗?哪个版本合适

    关于ITIL的演进 ITIL是在演进发展中的,v1并不成功,v2 v3讲究流程与控制,其实都是偏向务虚,理论东西较多,能落地的少或许OGC的专家们自己也发现 光靠口头忽悠并不能说服最终用户接受ITIL ...