node.js 下 mysql2 的 CURD 功能极简封装

此封装适合于使用 SQL 直接操作数据库的小型后端项目,更多功能请查阅MySQL2官网

// 代码保存到单独的 js 文件

const mysql = require('mysql2/promise')

const debug = true
let conn

/**
 * 执行 SQL 语句
 * @param {String} sql
 * @param {*} params
 * @returns {Array}
 */
const query = (sql, params)=> {
    if(!conn)  throw Error(`数据库连接未创建,请配置 useDB、dbName 属性...`)
    debug && console.debug("[SQL]", sql, "[PARAMS]",Array.isArray(params)?params[0]:(params||"(无)"))
    return conn.query(sql, params)
}

exports.query = query

/**
 * 创建 mysql 连接(使用连接池)
 * @param {import('.').ServerConfig} config
 * @returns
 */
exports.mysqlBuilder = async config=> {
    if(!!conn)  return
	
    conn = mysql.createPool({
        host: config.host || 'localhost',
        port: config.port || 3306,
        user: config.user || 'root',
        password: config.pwd || '',
        database: config.database,

        waitForConnections: true,
        connectionLimit: 10,
        idleTimeout: 180 * 1000,
        enableKeepAlive: true,
        keepAliveInitialDelay: 0
    })

    return conn
}

/**
 * 返回指定的sql结果数量
 * @param {String} table - 表名
 * @param {String} condition - 条件 SQL
 * @returns {Number}
 */
exports.count = async (table, condition, params) => {
    let [ results ] = await query(`SELECT COUNT(*) FROM ${table} WHERE ${condition}`, params)
    return Number(results[0])
}

/**
 * 按 ID 查询数据(单条)
 * @param {String} id
 * @param {String} table
 * @param {String} idField - ID字段名,默认 id
 * @returns {Object}
 */
exports.findById= async (id, table, idField="id")=>{
    let [ results ] = await query(`SELECT * FROM ${table} WHERE ${idField}=? LIMIT 1`, id)
    return results[0]
}


/**
 * 保存数据到指定表
 * @param {Object} obj - 待保存对象(默认取全部的字段,排除_开头)
 * @param {String} table - 表名
 * @param {Array<String>} ignores - 忽略的字段
 * @returns
 */
exports.saveObjToTable = async (obj, table, ignores=[])=>{
    let fields = Object.keys(obj).filter(k=> !(k.startsWith("_")  || ignores.includes(k)))
    let [ results ] = await query(`INSERT INTO ${table} (${fields.join(",")}) VALUES (${fields.map(v=>'?').join(",")})`, fields.map(v=> obj[v]))

    return results
}

/**
 * 将对象保存到指定数据表
 * @param {Object} obj - 待保存对象(默认取全部的字段,排除_开头)
 * @param {String} table - 表名
 * @param {String} idField - 主键字段名
 * @param {Array<String>} ignores - 忽略的字段
 * @returns
 */
exports.updateObjToTable = async (obj, table, idField="id", ignores=[])=>{
    let fields = Object.keys(obj).filter(k=> !(k!=idField, k.startsWith("_")  || ignores.includes(k) || obj[k]===undefined))
    let [ results ] = await query(
        `UPDATE ${table} set ${fields.map(f=>`${f}=?`).join(",")} WHERE ${idField}=?`,
        fields.concat(idField).map(v=> obj[v])
    )
    return results
}

/**
 * 将对象的某个字段进行 JSON 处理
 * @param {Object} obj - 待处理对象
 * @param {Array<String>} fields - 待转换的属性清单
 * @param {Boolean} toString - 转换为字符串,false=反序列到JSON对象
 */
exports.dealJSONField = (obj, fields, toString = true)=> {
    if(typeof(obj) == 'object'){
        fields
            .filter(k=> k in obj)
            .forEach(k=> obj[k] = toString ? JSON.stringify(obj[k]) : JSON.parse(obj[k]))
    }
    return obj
}

如何使用

const { mysqlBuilder, query } = require("basic/server/mysql")

await mysqlBuilder({ host:"localhost", database:"test", user:"root" })

let [ results ] = await query(`这里填写 SQL 语句`)
console.info(results )
// 更多语法请参考官方文档 https://sidorares.github.io/node-mysql2/docs
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

集成显卡

码字不易,需要您的鼓励😄

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

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

打赏作者

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

抵扣说明:

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

余额充值