sql插入更新语句封装

背景: 当我们项目上需要写原生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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值