背景: 当我们项目上需要写原生sql语句的时候,但是写插入更新语句都很麻烦,这里就封装了一个方便调用的函数
//设置表的主键
const tablePrimaryKey = {
t_fund_trade_data: { fund_id: true, trade_time: true },
t_fund_value_discount: { fund_id: true, hist_dt: true },
t_fund_stock_list: { fund_id: true, asset_id: true },
t_funds: { fund_id: true, },
t_funds_idx: { idx_id: true },
t_fund_user_rel: { fund_id: true, user_id: true },
t_fund_user_ban_rel: { fund_id: true, user_id: true },
t_fund_users: { user_id: true, },
}
/**
* 给数据表新增数据
* table:表名
* data: 数据 ,数组或对象 ,传入数组可插入更新多条数据,传入对象只能插入更新一条
* deallimit: 默认 10:,由于单条sql语句执行长度有限制, 这里可以控制单次处理数据的条数,可根据单条sql语句长度设置
* 插入单条数据
*
* insertData({
* table:'t_funds',
* data:{
* fund_id:1,
* fund_nm:'名称',
* },
*
* })
* 插入多条数据,注意 多条数据中的,数据字段要一样
* insertData({
* table:'t_funds',
* data:[
* { fund_id:1,fund_nm:'名称', },
* { fund_id:2,fund_nm:'名称1', },
* { fund_id:3,fund_nm:'名称2', },
* ],
* })
*
*/
exports.insertData = async function ({ table, data ,deallimit=10}){
data = Array.isArray(data) ?[...data]:[data]
if(data.length == 0 || !table) return
let result = true
//拆分插入
while(data.length >0){
let myData = data.splice(0,deallimit);
let sql = `insert into ${table} (`
let b = ''
let formatResult = []
// let sql = `insert into t_user_subscribe_msg (openid,msg_id,state,tag_id) values(?,?,?,?)
// on duplicate key update state=?,tag_id=?`
for(let key in myData[0]){
sql+=`${key},`
b+=`?,`
formatResult.push(myData[key])
}
sql = sql.slice(0,-1)
sql+=') '
b = b.slice(0,-1)
let allValue = ''
myData.forEach(args=>{
let value = '('
for(let key in args){
if(typeof args[key] === 'object'){
value+=`'${JSON.stringify(args[key])}',`
}else{
value+=`'${args[key]}',`
}
}
value = value.slice(0,-1)
value+='),'
allValue += value
})
allValue = allValue.slice(0,-1)
sql+=`values ${allValue} on duplicate key update `
for(let key in myData[0]){
if(!tablePrimaryKey[table][key]){
sql+=`${key}=VALUES(${key}),`
}
}
sql = sql.slice(0,-1)
sql = MYSQL.format(sql, formatResult);
console.log(sql)
let ret = await dbpool.query(sql,true);
if (ret.err) {
console.error("err")
console.error(sql)
result = false
return false;
}
// console.log(`插入更新数据成功,剩余${data.length}`)
}
console.log(`插入更新数据成功`)
return result
}
函数调用很方便,同时实现多条sql更新插入语句合并,增加执行速度
exports.insertData({
table:'t_fund_users',
data:[
{ user_id:408647,mini_userid:234,user_data:''},
{ user_id:408647,mini_userid:2344,user_data:23423}
]
})
合并出来的sql语句
insert into t_fund_users (user_id,mini_userid,user_data) values ('408647','234',''),('408647','2344','23423') on duplicate key update mini_userid=VALUES(mini_userid),user_data=VALUES(user_data)