美文网首页前端开发那些事儿每天学一点Vue3
封装webSQL(二)封装 insert into

封装webSQL(二)封装 insert into

作者: 自然框架 | 来源:发表于2021-07-23 10:08 被阅读0次

永远不要手撸SQL

SQL要手写吗?当然不是,我们可以根据功能进行各种封装,比如先封装一个添加 model 用的SQL。

添加语句

insert into tableName (字段名称) values (值) 

可惜,不支持 set 的方式

然后我们可以依据 meta 和 model 来拼接这个SQL。


/**
 * 实现添加数据的功能。拼接 insert 的 SQL语句
 * @param { MySQLHelp } help 访问数据库的实例
 * @param { Object } meta 表、字段
 * @param { Object } model 数据
 * @param { connection } cn 如果使用事务的话,需要传递开启事务时创建的连接对象
 * @returns 添加记录的ID
 * * meta 结构:
 * * * tableName: '', 表名
 * * * cols:{colName: '类型'}, josn 字段需要标记 
 * * model 结构:
 * * * colName: value 
 */
export default function addData(help, meta, model, cn = null) {
  // 拼接添加用的SQL语句,
  // 提交SQL语句
  // console.log('addData,开始运行 :')
  const myPromise = new Promise((resolve, reject) => {
    // 记录字段名称
    const colNames = []
    // 记录字段对应的值
    const colValues = []
    // 记录字段对应的占位符合
    const cols = []
    // 变量对象,记录 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])
      }
      cols.push('?')
    }
    const sql = `INSERT INTO ${meta.tableName}
      ( ${colNames.join(',')} ) VALUES ( ${cols.join(',')} )`

    // console.log('insertSQL:', sql)
    help.query(sql, colValues, cn)
      .then((res) => {
        // 成功了,返回给调用者
        resolve(res.insertId)
      })
      .catch((err) => {
        reject(err)
      })
  })
  return myPromise
}

这样我们就有了一个把 model 填入webSQL 的函数。

因为MySQL的字段类型可以是json,而前端的model又有可能会有子对象,那么在拼串的时候,判断了一下属性,如果是 Object,那么序列化一下。
添加结果如下:

序列化

使用方式

首先引入js,创建实例


// 测试webSQL的 add
import webSQL from '../../packages/nf-ws-indexeddb/help.js'
import addModel from '../../packages/nf-ws-indexeddb/data-add.js'

const info = {
  dbName: 'test_websqldb',
  ver: '1',
  size: 2,
  description: '测试一下新的封装方式'
}
const help = new webSQL(info)

然后定义meta和model


const meta = {
  tableName: 't_table'
}
const model = {
  a: '1111',
  b: {
    b1: 'b1',
    b2: 'b2'
  }
}
  1. 单独执行
addModel(help, meta, model).then((res) => {
  console.log('添加完毕', res)
}).catch((err) => {
  console.log('添加出现异常:', err)
})
  1. 事务执行

help.begin().then((cn) => {
  model.a = '2222'
  addModel(help, meta, model, cn).then((res) => {
    console.log('添加完毕', res)
  }).catch((err) => {
    console.log('添加出现异常:', err)
  })

  model.a = '3333'
  addModel(help, meta, model, cn).then((res) => {
    console.log('添加完毕', res)
  }).catch((err) => {
    console.log('添加出现异常:', err)
  })
})

执行结果:

执行记录

组合还是继承?

上面那种写法是组合的方式,在基础的help上面组合了一个add的方法,help作为参数传入。

试着写了一下继承的方式,感觉怪怪的,算了不用了。
当然也可能是我实力不够,无法驾驭吧。

想好了,再说。。。

相关文章

网友评论

    本文标题:封装webSQL(二)封装 insert into

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