前端开发那些事儿每天学一点Vue3

封装webSQL(三)封装 update

2021-07-24  本文已影响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 ,这样就要维护二者的一致性,增加了负担。

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

上一篇 下一篇

猜你喜欢

热点阅读