做網(wǎng)站用win還是li注冊百度賬號
此封裝適合于使用 SQL 直接操作數(shù)據(jù)庫的小型后端項(xiàng)目,更多功能請查閱MySQL2官網(wǎng)
// 代碼保存到單獨(dú)的 js 文件const mysql = require('mysql2/promise')const debug = true
let conn/*** 執(zhí)行 SQL 語句* @param {String} sql* @param {*} params* @returns {Array}*/
const query = (sql, params)=> {if(!conn) throw Error(`數(shù)據(jù)庫連接未創(chuàng)建,請配置 useDB、dbName 屬性...`)debug && console.debug("[SQL]", sql, "[PARAMS]",Array.isArray(params)?params[0]:(params||"(無)"))return conn.query(sql, params)
}exports.query = query/*** 創(chuàng)建 mysql 連接(使用連接池)* @param {import('.').ServerConfig} config* @returns*/
exports.mysqlBuilder = async config=> {if(!!conn) returnconn = 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結(jié)果數(shù)量* @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 查詢數(shù)據(jù)(單條)* @param {String} id* @param {String} table* @param {String} idField - ID字段名,默認(rèn) 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]
}/*** 保存數(shù)據(jù)到指定表* @param {Object} obj - 待保存對象(默認(rèn)取全部的字段,排除_開頭)* @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
}/*** 將對象保存到指定數(shù)據(jù)表* @param {Object} obj - 待保存對象(默認(rèn)取全部的字段,排除_開頭)* @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
}/*** 將對象的某個(gè)字段進(jìn)行 JSON 處理* @param {Object} obj - 待處理對象* @param {Array<String>} fields - 待轉(zhuǎn)換的屬性清單* @param {Boolean} toString - 轉(zhuǎn)換為字符串,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