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

Node.js教程-mysql模块

概述

Node.js中,mysql模块是实现MySQL协议的JavaScript客户端工具。Node.js程序通过与MySQL建立链接,然后可对数据进行等操作。

安装

由于mysql模块不是Node.js内置模块,需手动安装

npm i mysql

注意:若MySQL服务的版本高于8.0.4时,请安装mysql2模块,否则连接时会出现身份验证错误。

使用

连接数据库

mysql.createConnection(options) // 返回 Connection 对象

参数说明:

  • options 配置参数
    • host 主机地址。默认为localhost
    • user 用户名
    • password 密码
    • port 端口号。默认为3306
    • database 数据库名
    • charset 字符集。默认为UTF8_GENERAL_CI
    • localAddress 此IP用于TCP连接
    • socketPath 连接到 unix 域路径,有值会忽略 hostport
    • timezone 时区。默认为local
    • connectTimeout 连接超时时长,单位 毫秒。默认为不限制
    • stringifyObject 是否序列化对象
    • dateStrings 强制将timestampdatetimedate类型以字符串型返回。默认为false
    • multipleStatements 是否允许一个 query 中有多个 mysql 语句。默认为false

Connection 方法

方法说明
connect() 建立连接
query(sql[, values][, callback])对数据库进行等操作
end()在确保当前正在处理的 SQL 语句正常完成后断开连接
destroy()立即断开连接,不管当前是否正在执行任务

Connection 属性

属性说明
threadId 当前连接线程 ID
// 引入 mysql 模块
const mysql = require('mysql')// 创建连接对象
const conn = mysql.createConnection({host: '127.0.0.1',port: '3306',database: 'node_db',user: 'root',passord: '123456'
})// 建立连接
conn.connect()

操作数据库

查询数据
const mysql = require('mysql2')// 创建 Connnection 实例
const conn = mysql.createConnection({host: '127.0.0.1',port: 3306,database: 'db',user: 'root',password: '123456'
})// 建立连接
conn.connect()// 无查询条件
const sql1 = "select * from talbe_name"
conn.query(sql1, (err, result) => {if (err) {console.error("查询数据出现异常:" + err.message)}console.log(result)
})// 有查询条件
const sql2 = "select * from talbe_name where col1 > ? and col2 = ? ..."
conn.query(sql2, [col1_val, col2_val, ...], (err, result) => {if (err) {console.error("查询数据出现异常:" + err.message)}console.log(result)
})// 管理连接
conn.end()

注意:通过query()查询,获取的数据结果为一个数组。

插入数据
const mysql = require('mysql2')// 创建 Connection 实例
const conn = mysql.createConnection({host: "127.0.0.1",port: 3306,database: "db",user: "root",password: "123456"
})// 建立连接
conn.connect()/****************** 插入操作 *********************/
const sql1 = "insert into talbe_name values(?, ?, ...)"
conn.query(sql1, [col1_val, col2_val, ...], (err, data) => {if (err) {console.error("插入数据出现异常:" + err.message)}// 判断数据是否插入成功if (data.affectedRows !== 1) {console.error("插入数据失败")}console.log("数据插入成功")
})const sql2 = "insert into (col1, col2, ...) talbe_name values(?, ?, ...)"
conn.query(sql2, [col1_val, col2_val, ...], (err, data) => {if (err) {console.error("插入数据出现异常:" + err.message)}// 判断数据是否插入成功if (data.affectedRows !== 1) {console.error("插入数据失败")}console.log("数据插入成功")
})// 此种方式中 query中的第二个参数名必须和数据库中表的名称一样
const sql3 = "insert into talbe_name set ?"
conn.query(sql3, xx, (err, data) => {if (err) {console.error("插入数据出现异常:" + err.message)}// 判断数据是否插入成功if (data.affectedRows !== 1) {console.error("插入数据失败")}console.log("数据插入成功")
})// 断开连接
conn.end()
修改数据
const mysql = require('mysql2')// 创建 Connection 实例
const conn = mysql.createConnection({host: "127.0.0.1",port: 3306,database: "db",user: "root",password: "123456"
})// 建立连接
conn.connect()/****************** 更新操作 *********************/
const sql1 = "updte user talbe_name col1 = ?, col2=?, ... where id = ?)"
conn.query(sql1, [col1_val, col2_val, ..., id_val], (err, data) => {if (err) {console.error("插入数据出现异常:" + err.message)}// 判断数据是否插入成功if (data.affectedRows !== 1) {console.error("插入数据失败")}console.log("数据插入成功")
})// 此种方式中 query中的第二个参数名必须和数据库中表的名称一样
const sql3 = "update talbe_name set ? where id = ?"
conn.query(sql3, [xx, id_val], (err, data) => {if (err) {console.error("更新数据出现异常:" + err.message)}// 判断数据是否插入成功if (data.affectedRows !== 1) {console.error("更新数据失败")}console.log("数据更新成功")
})// 断开连接
conn.end()
删除数据
const mysql = require('mysql2')// 创建 Connnection 实例
const conn = mysql.createConnection({host: '127.0.0.1',port: 3306,database: 'db',user: 'root',password: '123456'
})// 建立连接
conn.connect()// 无条件删除
const sql = "delete from talbe_name "
conn.query(sql1, (err, data) => {if (err) {console.error("删除数据出现异常:" + err.message)}// 判断数据是否删除成功if (data.affectedRows > 0) {console.error("删除数据失败")}console.log(result)
})// 有条件删除
const sql2 = "delete from talbe_name where id = ?"
conn.query(sql2, id_val, (err, data) => {if (err) {console.error("删除数据出现异常:" + err.message)}// 判断数据是否删除成功if (data.affectedRows !== 0) {console.error("删除数据失败")}console.log(result)
})// 管理连接
conn.end()

问题

连接报ER_NOT_SUPPORTED_AUTH_MODE错误

原因

MySQL 8.0.4开始,MySQL默认身份验证插件从 mysql_native_password改为caching_sha2_password所导致的。

解决方式

解决方式有两种:

  1. 身份验证插件改 mysql_native_password
  2. 安装 mysql2模块

相关文章:

Node.js教程-mysql模块

概述 在Node.js中,mysql模块是实现MySQL协议的JavaScript客户端工具。Node.js程序通过与MySQL建立链接,然后可对数据进行增、删、改、查等操作。 安装 由于mysql模块不是Node.js内置模块,需手动安装 npm i mysql注意:若MySQL服…...

网络通信协议

WebSocket通信 WebSocket是一种基于TCP的网络通信协议,提供了浏览器和服务器之间的全双工通信(full-duplex)能力。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接&#xff…...

Spark集群部署与架构

在大数据时代,处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具,可以在集群中高效运行,处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群,以满足大规模数据处理的需求。 Spark集群架构…...

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC,同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南,旨在帮助软件开发工程师、技术支持工程师快速上手&am…...

【5G PHY】NR参考信号功率和小区总传输功率的计算

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...

k8s学习 — 各知识点快捷入口

k8s学习 — 各知识点快捷入口 k8s学习 — 第一章 核心概念 k8s学习 — 第一章 核心概念 命名空间 实践: k8s学习 — (实践)第二章 搭建k8s集群k8s学习 — (实践)第三章 深入Podk8s学习 — (实践&#xff0…...

【Python】Python 批量转换PDF到Excel

PDF是面向展示和打印使用的,并未考虑编辑使用,所以缺少了很多编辑属性且非常难修改PDF里面的数据。当您需要分析或修改PDF文档数据时,可以将PDF保存为Excel工作簿,实现轻松编辑数据的需求。PDF转Excel,技术关键就是提取…...

Python并行计算和分布式任务全面指南

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python并行计算和分布式任务全面指南。全文2900字,阅读大约8分钟 并发编程是现代软件开发中不可或缺的一部分,它允许程序同时执行多个任务&#xff0…...

微信小程序promise封装

一. 在utils文件夹内创建一个request.js 写以下封装的 wx.request() 方法 const baseURL https:// 域名 ; //公用总路径地址 export const request (params) > { //暴露出去一个函数,并且接收一个外部传入的参数let dataObj params.data || {}; //…...

hash长度扩展攻击

作为一个信息安全的人,打各个学校的CTF比赛是比较重要的! 最近一个朋友发了道题目过来,发现有道题目比较有意思,这里跟大家分享下 这串代码的大致意思是: 这段代码首先引入了一个名为"flag.php"的文件&am…...

设计模式--命令模式

实验16:命令模式 本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解命令模式的动机,掌握该模式的结构; 2、能够利用命令模式解决实际问题。 [实验任务]:多次撤销和重复的命令模式 某系…...

单例模式的七种写法

为什么使用单例? 避免重复创建对象,节省内存,方便管理;一般我们在工具类中频繁使用单例模式; 1.饿汉式(静态常量)-[可用] /*** 饿汉式(静态常量)*/ public class Singleton1 {private static final Singleton1 INSTANCE new Singleton1();private Singleton1(){}…...

ElasticSearch入门介绍和实战

目录 1.ElasticSearch简介 1.1 ElasticSearch(简称ES) 1.2 ElasticSearch与Lucene的关系 1.3 哪些公司在使用Elasticsearch 1.4 ES vs Solr比较 1.4.1 ES vs Solr 检索速度 2. Lucene全文检索框架 2.1 什么是全文检索 2.2 分词原理之倒排索引…...

【FPGA】分享一些FPGA视频图像处理相关的书籍

在做FPGA工程师的这些年,买过好多书,也看过好多书,分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…...

AUTOSAR从入门到精通-车载以太网(四)

目录 前言 原理 车载以太网发展历史 为何选择车载以太网...

MySQL报错:1054 - Unknown column ‘xx‘ in ‘field list的解决方法

我在操作MySQL遇到1054报错,报错内容:1054 - Unknown column Cindy in field list,下面演示解决方法,非常简单。 根据箭头指示,Cindy对应的应该是VARCHAR文本数字类型,字符串要用引号,所以解决方…...

【Android 13】使用Android Studio调试系统应用之Settings移植(四):40+个依赖子模块之ActionBarShadow

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、子模块AS移植3.1 AS创建目标3.2 创建ActionBarShadow(1)使用VS Code打开org_settings/SettingsLib目录(2)ActionBarShadow的Manifest.xml(3)ActionBarShadow的An…...

nosql-redis整合测试

nosql-redis整合测试 1、创建项目并导入redis2、配置redis3、写测试类4、在redis中创建key5、访问80826、在集成测试中测试方法 1、创建项目并导入redis 2、配置redis 3、写测试类 4、在redis中创建key 5、访问8082 6、在集成测试中测试方法 package com.example.boot3.redis;…...

智能化中的控制与自动化中的控制不同

智能化中的控制相对于自动化中的控制更加灵活、智能、综合和学习能力强。智能化控制系统能够根据实际情况进行自主决策和优化,适用范围更广,效果更好。 首先,智能化控制系统能够根据外部环境的变化和实时数据的反馈来自主调整和优化控制策略&…...

java练习题之多态练习

1:关于多态描述错误的是(D) A. 父类型的引用指向不同的子类对象 B. 用引用调用方法,只能调用引用中声明的方法 C. 如果子类覆盖了父类中方法,则调用子类覆盖后的方法 D. 子类对象类型会随着引用类型的改变而改变 2:class Supe…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...