当前位置: 首页 > news >正文

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)  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结果数量* @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

相关文章:

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

此封装适合于使用 SQL 直接操作数据库的小型后端项目&#xff0c;更多功能请查阅MySQL2官网 // 代码保存到单独的 js 文件const mysql require(mysql2/promise)const debug true let conn/*** 执行 SQL 语句* param {String} sql* param {*} params* returns {Array}*/ const…...

Cloud-Eureka服务治理-Ribbon负载均衡

构建Cloud父工程 父工程只做依赖版本管理 不引入依赖 pom.xml <packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEA…...

Northwestern University-844计算机科学与技术/软件工程-机试指南【考研复习】

本文提到的西北大学是位于密歇根湖泊畔的西北大学。西北大学&#xff08;英语&#xff1a;Northwestern University&#xff0c;简称&#xff1a;NU&#xff09;是美国的一所著名私立研究型大学。它由九人于1851年创立&#xff0c;目标是建立一所为西北领地地区的人服务的大学。…...

【Linux的网络编程】

1、OSI的七层网络模型有哪些&#xff0c;每一层有什么作用&#xff1f; 答&#xff1a;&#xff08;1&#xff09;应用层&#xff1a;负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确。 &#xff08;2&#xff09;表…...

vue-seamless-scroll 点击事件不生效

问题&#xff1a;在使用此插件时发现&#xff0c;列表内容前几行还是能正常点击的&#xff0c;但是从第二次出现的列表开始就没有点击事件了 原因&#xff1a;因为html元素是复制出来的&#xff08;滚动组件是将后面的复制出来一份&#xff0c;进行填铺页面&#xff0c;方便滚动…...

前端工程部署步骤小记

安装mqtt: “mqtt”: “^4.3.7”, npm install git panjiacheng 后台demo下载zip 1、npm install --registryhttps://registry.npmmirror.com 2、npm run dev 前端demo创建 1、安装npm 2、npm install vuenext 3、npm install -g vue/cli 查看版本 vue --version 4、更新插件…...

TS常见问题

文章目录 1. 什么是 TypeScript&#xff1f;它与 JavaScript 有什么区别&#xff1f;2. TS 泛型、接口、泛型工具record、Pick、Omit3. TS unknow和any的区别&#xff0c;如何告诉编译器unknow一定是某个类型&#xff1f;4. 元组与常规数组的区别5. 什么是泛型,有什么作用&…...

linux系统nginx常用命令

查nginx位置 find / -name nginx nginx目录&#xff1a;/usr/local/ 查看nginx进程号 ps -ef |grep nginx 停止进程 kill 2072 启动 ./sbin/nginx /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf 启动并校验校验配置文件 ./sbin/nginx -t 看到如下显…...

MySQl基础入门③

上一遍内容 接下来我们都使用navicat软件来操作数据了。 1.新建数据库 先创建我门自己的一个数据库 鼠标右键点击bendi那个绿色海豚的图标&#xff0c;然后选择新建数据库。 数据库名按自己喜好的填&#xff0c;不要写中文&#xff0c; 在 MySQL 8.0 中&#xff0c;最优的字…...

idea Gradle 控制台中文乱码

如下图所示&#xff0c;idea 中的 Gradle 控制台中文乱码&#xff1a; 解决方法&#xff0c;如下图所示&#xff1a; 注意&#xff1a;如果你的 idea 使用 crack 等方式破解了&#xff0c;那么你可能需要在文件 crack-2023\jetbra\vmoptions\idea.vmoptions 中进行配置&#xf…...

嵌入式学习day31 网络

网络: 数据传输,数据共享 1.网络协议模型: OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&#xff08;数据报…...

Docker网络+原理+link+自定义网络

目录 一、理解Docker网络 1.1 运行tomcat容器 1.2 查看容器内部网络地址 1.3 测试连通性 二、原理 2.1 查看网卡信息 2.2 再启动一个容器测试网卡 2.3 测试tomcat01 和tomcat02是否可以ping通 2.4 只要删除容器,对应网桥一对就没了 2.5 结论 三、--link 3.…...

Effective C++ 学习笔记 条款16 成对使用new和delete时要采取相同形式

以下动作有什么错&#xff1f; std::string *stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序&#xff0c;使用了new&#xff0c;也搭配了对应的delete。但还是有某样东西完全错误&#xff1a;你的程序行为未定义。至少&#xff0c;str…...

PokéLLMon 源码解析(四)

.\PokeLLMon\poke_env\exceptions.py """ This module contains exceptions. """# 定义一个自定义异常类 ShowdownException&#xff0c;继承自内置异常类 Exception class ShowdownException(Exception):"""This exception is …...

区块链基础知识01

区块链&#xff1a;区块链技术是一种高级数据库机制&#xff0c;允许在企业网络中透明地共享信息。区块链数据库将数据存储在区块中&#xff0c;而数据库则一起链接到一个链条中。数据在时间上是一致的&#xff0c;在没有网络共识的情况下&#xff0c;不能删除或修改链条。 即&…...

YOLOv9(2):YOLOv9网络结构

1. 前言 本文仅以官方提供的yolov9.yaml来进行简要讲解。 讲解之前&#xff0c;还是要做一些简单的铺垫。 Slice层不做任何的操作&#xff0c;纯粹是做一个占位层。这样一来&#xff0c;在parse_model时&#xff0c;ch[n]可表示第n层的输出通道。 Detect和DDetect主要区别还…...

提取b站字幕(视频字幕、AI字幕)

提取b站字幕&#xff08;视频字幕、AI字幕&#xff09; 1. 打开视频 2. 按 F12 进行开发者界面 视频自己的紫米输入的是 json&#xff0c;如果是AI字幕则需要输入 ai_subtitle 3. 进入这个网址&#xff1a;https://www.dreamlyn.cn/bsrt...

JAVA程序员如何快速熟悉新项目?

文章目录 Java程序员快速熟悉一个新项目的步骤通常包括以下几个方面&#xff1a;实例展示&#xff1a;Java程序员加入新项目时可能遇到的技术难题及其解决方案包括&#xff1a; Java程序员快速熟悉一个新项目的步骤通常包括以下几个方面&#xff1a; 理解项目背景和目标&#x…...

慢sql优化记录1

慢sql为&#xff1a; select count(*) from t_wf_process p left join t_wf_core_dofile dofile on p.wf_instance_uid dofile.instanceid join zwkj_department d on p.userdeptid d.department_guid ,t_wf_core_item i,wf_node n where (p.IS_DUPLICATE ! true or p.IS_DU…...

堆和堆排序

堆排序是一种与插入排序和并归排序十分不同的算法。 优先级队列 Priority Queue 优先级队列是类似于常规队列或堆栈数据结构的抽象数据类型&#xff08;ADT&#xff09;。优先级队列中的每个元素都有一个相关联的优先级key。在优先级队列中&#xff0c;高优先级的元素优先于…...

Guohua Diffusion 数据库集成方案:MySQL管理生成任务与作品元数据

Guohua Diffusion 数据库集成方案&#xff1a;MySQL管理生成任务与作品元数据 如果你用过Guohua Diffusion这类图像生成工具&#xff0c;可能会遇到一个头疼的问题&#xff1a;生成的图片越来越多&#xff0c;管理起来越来越乱。今天想找上周生成的那张“赛博朋克风格的城市夜…...

dfs:飞机降落

题目&#xff1a;P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 做题目之前一定要先看数据范围。这道题的数据范围&#xff0c;T,N均<10&#xff0c;可以用暴力搜索。 这道题是排序&#xff0c;假设有3辆飞机。顺序可以是123&#xff0c;132&#xff0c;213&#xff0c;231&am…...

从Pikachu靶场实战解析越权漏洞:原理、攻击与防御

1. 越权漏洞&#xff1a;Web安全的隐形杀手 第一次接触越权漏洞是在三年前的一次渗透测试中&#xff0c;当时客户系统有个"查看订单详情"的功能&#xff0c;我无意间发现修改URL中的订单ID就能看到别人的订单信息。这种看似简单的漏洞&#xff0c;实际上危害极大——…...

[FFXIVChnTextPatch]:国际服中文补丁解决方案——从入门到精通

[FFXIVChnTextPatch]&#xff1a;国际服中文补丁解决方案——从入门到精通 【免费下载链接】FFXIVChnTextPatch 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIVChnTextPatch 一、问题引入&#xff1a;当语言成为游戏体验的隐形壁垒 你是否曾在探索艾欧泽亚大陆时…...

边缘计算与 AI 结合:奥尔特云低功耗边缘算力设备

这款高性能边缘智能算力设备&#xff0c;搭载16T算力AI处理器&#xff0c;以高性能、低功耗、易扩展为核心优势&#xff0c;为用户提供一站式智能化解决方案。设备内置人脸、视频结构化等基础算法&#xff0c;可扩展工业、矿山、能源、园区、城管、无人机巡检等行业专用算法包&…...

二分查找/二分答案

0.前言二分算法&#xff08;Binary Search&#xff09;&#xff0c;也叫折半查找&#xff0c;是一种在有序数据集合中高效查找目标值的算法。它通过不断将查找范围缩小一半&#xff0c;快速定位目标&#xff0c;时间复杂度为 O(logn)&#xff0c;远优于线性查找的 O(n)。1.原理…...

Adafruit DPS310传感器驱动库深度解析与嵌入式实践

1. Adafruit DPS310 压力传感器驱动库深度解析与工程实践 1.1 项目定位与硬件基础 Adafruit DPS310 是一款高精度、低功耗的数字气压/温度传感器&#xff0c;基于 Infineon&#xff08;原 Bosch Sensortec&#xff09;DPS310 芯片设计。该芯片采用 MEMS 技术&#xff0c;集成…...

Python WASM部署避坑手册(27个真实故障现场还原)

第一章&#xff1a;Python WASM部署的演进脉络与技术边界WebAssembly&#xff08;WASM&#xff09;最初为C/C/Rust等系统语言设计&#xff0c;其确定性执行模型与接近原生的性能使其迅速成为浏览器端高性能计算的事实标准。Python作为动态、解释型、依赖运行时的高级语言&#…...

这份榜单够用!盘点2026年用户挚爱的一键生成论文工具

一天写完毕业论文在2026年已不再是天方夜谭。以下是2026年最炸裂、实测能大幅提速的一键生成论文工具&#xff0c;覆盖选题构思、文献综述、数据整理、格式排版等核心场景&#xff0c;高效搞定论文不再只是梦想。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一…...

终极指南:如何用LanceDB向量数据库构建智能学习资源检索系统

终极指南&#xff1a;如何用LanceDB向量数据库构建智能学习资源检索系统 【免费下载链接】lancedb Developer-friendly, serverless vector database for AI applications. Easily add long-term memory to your LLM apps! 项目地址: https://gitcode.com/gh_mirrors/la/lanc…...