修改语句
这里的修改,特指通过主键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'
}
}
- 单独执行
updateModel(help, meta, model, 50).then((res) => {
console.log('修改完毕', res)
}).catch((err) => {
console.log('修改出现异常:', err)
})
- 事务执行
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 ,这样就要维护二者的一致性,增加了负担。
总之,如何设定,需要综合考虑。
网友评论