美文网首页用node做个后端API前端开发那些事儿
封装 MySQL(三)封装 update——updateMode

封装 MySQL(三)封装 update——updateMode

作者: 自然框架 | 来源:发表于2021-08-09 17:39 被阅读0次

    接上。。。

    修改语句

    这里的修改,特指通过主键ID,修改记录(model),其他修改方式再封装其他函数。

    UPDATE aaa set aaacol = ? WHERE id=?
    

    这个比较简单,只是多了一个主键字段,我们还是依据 meta 和 model 来拼接SQL。

     
    /**
     * 实现添加数据的功能。拼接 UPDATE 的 SQL语句
     * @param { MySQLHelp } help 访问数据库的实例
     * @param { Object } info 表、字段
     * @param { Object } values 数据
     * @param { number|string } id 数据
     * @returns 影响的记录数
     * * info 结构:
     * * * tableName: '', 表名
     * * * id '', 主键名称
     * * * cols:{colName: '类型'}, josn 字段需要标记 
     * * values 结构:
     * * * colName: value 
     * * id 结构:number string
     */
    function updateData(help, info, values, id, cn = null) {
      // 拼接 修改 用的SQL语句,
      const myPromise = new Promise((resolve, reject) => {
        // sql = 'UPDATE aaa set aaacol = ? WHERE id=?'
        // 获取字段名称和值的数组
        const { colNames, params } = help.createTableCols(info, values)
        const sql = `UPDATE ${info.tableName} SET ${colNames.join(',')} WHERE ${info.idKey} = ? `
        params.push(id)
    
        const _cn = cn === null ? help.db : cn
    
        help.query(sql, params,_cn)
          .then((res) => {
            // 修改成功,返回影响行数
            resolve(res.affectedRows)
          })
          .catch((res) => {
            // 出错了
            reject(res)
          })
        })
      return myPromise
    }
    module.exports = updateData
    

    使用方式,做个服务层

    // 引入help
    const { updateModel } = require('../../packages/mysql.js')
    
    console.log('\n★ update 文件被加载\n')
    
    /**
     * 实现修改服务
     * @param {object} userInfo 当前登录人的信息
     * @param {object} help 访问数据库的实例
     * @param {objec} serviceInfo 服务的 meta
     * @param {object} model 前端提交的 body
     * @param {number|string} id 记录ID
     * @returns 返回新添加的记录的ID
     */
    const update = (userInfo, help, serviceInfo, model, id) => {
      return new Promise((resolve, reject) => {
        // 加载meta
        modelName = serviceInfo.model
        const info = require(`../../public/model/${modelName}.json`)
    
        console.log('\n启动 update 服务\n')
        updateModel(help, info, model, id).then((count) => {
          console.log('外部修改数据,影响行数:', count)
          resolve({ count })
        }).catch((err) => {
          reject('修改数据出错!')
        })
    
      })
    }
    
    module.exports = update
    
    

    每一个小功能都做成了独立的 js 文件。
    其实一开始想做一个大的class,后来觉得代码太长不好维护,于是想做成子类的形式,但是想想似乎没啥必要,除了少传递一个help参数之外好像没啥区别。
    所以最后决定采用这种方式。

    看起来似乎有点雷同,因为这里其实是分了两个层,一个是数据层,实现基础的SQL语句的拼接,有一点点ORM的意思。

    一个是服务层,接收前端传递的数据,然后调用数据层实现功能。

    最外面还有一个路由,负责做服务分发。

    未完待续。。。

    源码:

    https://gitee.com/naturefw/node-services

    https://gitee.com/naturefw/node-services/tree/master/packages

    相关文章

      网友评论

        本文标题:封装 MySQL(三)封装 update——updateMode

        本文链接:https://www.haomeiwen.com/subject/stdkvltx.html