封装webSQL(三)封装 update

作者: 自然框架 | 来源:发表于2021-07-24 20:26 被阅读0次

    修改语句

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

    update table set col1= '11'  where id = 111
    

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

    
    /**
     * 实现修改数据的功能。拼接 update 的 SQL语句
     * @param { MySQLHelp } help 访问数据库的实例
     * @param { Object } meta 表、字段
     * @param { Object } model 数据
     * @param { number|string } id 主键字段值
     * @param { connection } cn 如果使用事务的话,需要传递开启事务时创建的连接对象
     * @returns 影响的行数
     * * meta 结构:
     * * * tableName: '', 表名
     * * * idKey: 'id', 主键字段名称
     * * model 结构:
     * * * colName: value
     */
    export default function updateData (help, meta, model, id, cn = null) {
      // 拼接修改用的SQL语句,
      const myPromise = new Promise((resolve, reject) => {
        // 记录字段名称
        const colNames = []
        // 记录字段对应的值
        const colValues = []
        // 变量对象,记录 key和 value
        for (const key in model) {
          colNames.push(key + '=? ')
          if (typeof model[key] === 'object') {
            colValues.push(JSON.stringify(model[key], null, 2))
          } else {
            colValues.push(model[key])
          }
        }
        // 加入查询条件
        colValues.push(id)
    
        const sql = `UPDATE ${meta.tableName} SET ${colNames.join(',')} WHERE ${meta.idKey}=?`
        // console.log('updateSQL:', sql)
    
        help.query(sql, colValues, cn)
          .then((res) => {
            // 成功了,返回给调用者
            resolve(res.rowsAffected)
          })
          .catch((err) => {
            reject(err)
          })
      })
      return myPromise
    }
    
    

    使用方式

    首先引入js,创建实例。

    // 测试webSQL的 add
    import {
      webSQL,
      updateModel, // 修改记录
      addModel 
    } from '../../packages/websql.js'
    
    const info = {
      dbName: 'test_websqldb',
      ver: '1',
      size: 2,
      description: '测试一下新的封装方式'
    }
    const help = new webSQL(info)
    

    然后定义meta和model

    const meta = {
      tableName: 't_table',
      idKey: 'id' // 设置主键字段
    }
    const model = {
      a: '1111',
      b: {
        b1: 'b1',
        b2: 'b2'
      }
    }
    
    1. 单独执行
    
    updateModel(help, meta, model, 50).then((res) => {
      console.log('修改完毕', res)
    }).catch((err) => {
      console.log('修改出现异常:', err)
    })
    
    
    1. 事务执行
    
    help.begin().then((cn) => {
      model.a = '777'
      updateModel(help, meta, model, 51, cn).then((res) => {
        console.log('修改完毕', res)
      }).catch((err) => {
        console.log('修改出现异常:', err)
      })
    
      model.a = '888'
      updateModel(help, meta, model, 52, cn).then((res) => {
        console.log('修改完毕', res)
      }).catch((err) => {
        console.log('修改出现异常:', err)
      })
    })
    

    执行结果:

    执行记录 修改结果

    这样一个可以修改model的SQL就封装完毕了。
    因为前段存储,安全性不用太高,所以直接根据model的key来拼接字段名称。

    但是后端数据库的话,就不能这么做了,必须使用 meta 里面设定的字段名称才行,因为 meta 会保存在后端,不是前端提交的。这样安全性会更高一些。

    那么前端为啥没有使用 meta 里面的字段名称呢?因为我想简洁一些,否则的话meta 里面需要设置一套字段名,然后 model 还要根据字段名设置 key ,这样就要维护二者的一致性,增加了负担。

    总之,如何设定,需要综合考虑。

    相关文章

      网友评论

        本文标题:封装webSQL(三)封装 update

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