node中使用mysql

在nodeJs中mysq的基础用法

mysql基础

增删改查

const mysql = require('mysql')const connection = mysql.createConnection({host: 'localhost', // 数据库的IP地址port: 3306, // 端口号user: 'root', // 登录数据库的账号password: '123456', // 登录数据库的密码database: 'test', // 指定要操作哪个数据库
})// 建立连接
connection.connect()// 检测mysql模块能否正常工作
connection.query('select 1', (err, results) => {if (err) {return console.log(err.message)}// 只要能打印出[ RowDataPacket {'1':1} ]的结果,就证明数据库连接正常console.log(results)
})// 查询数据
connection.query('SELECT * FROM news', (err, result) => {// err:可能产生的错误// result:SQL语句的结果if (err) throw errconsole.log(result)
})// 插入数据
connection.query(`INSERT INTO news VALUES('2','标题','2020-09-09','/shutterbug.jpg','描述','内容')`, (err, result) => {if (err) throw errconsole.log(result)
})// 更新数据
connection.query('UPDATE news SET title="lucky" WHERE id=3', (err, result) => {if (err) throw errconsole.log(result)
})// 删除数据
connection.query('DELETE FROM news WHERE id=04', (err, result) => {if (err) throw errconsole.log(result)
})

连接池技术 

数据库的连接池负责分配、管理和释放数据库连接对象。它允许应用程序重复使用一个现有的数据库的连接对象,而不是重新创建一个

const mysql = require('mysql')// 建立与MySQL数据库的连接
var db = mysql.createPool({host: 'localhost', // 数据库的IP地址port: 3306, // 端口号user: 'root', // 登录数据库的账号password: '123456', // 登录数据库的密码database: 'test', // 指定要操作哪个数据库connectionLimit: 10 // 一次创建的最大连接数(默认值:10)
})// 查询news表中的所有数据
const query_sql = 'select * from news'
db.query(query_sql, (err, results) => {if (err) {return console.log(err.message)}console.log(results)
})// 插入数据
// 要插入的数据对象
const add_obj = { filename: '11653277206', title: '体育' }
// 待执行的SQL语句,其中英文的?代表占位符,id虽是自增,但也要占位,不然报错
const add_sql = 'INSERT INTO news (id,filename,title) VALUES (0,?,?)'
// 使用数组的形式,依次为?占位符指定具体的值
db.query(add_sql, [add_obj.filename, add_obj.title], (err, results) => {if (err) {return console.log(err.message)}if (results.affectedRows === 1) {console.log('插入数据成功')}
})// 插入数据的便捷方式
// 要插入的数据对象,id 为 0 会自增
const add_obj1 = { id: '0', filename: '音乐2' }
// 待执行的SQL语句,其中英文的?表示占位符
const add_sql1 = 'INSERT INTO news SET ?'
// 直接将数据对象当作占位符的值
db.query(add_sql1, add_obj1, (err, results) => {if (err) {return console.log(err.message)}if (results.affectedRows === 1) {console.log('插入数据成功')}
})// 更新数据
const edit_obj = { id: '14', filename: '形势与政策' }
const edit_sql = 'UPDATE news SET filename=? WHERE id=?'
// 调用db.query()执行SQL语句的同时,使用数组依次为占位符指定具体的值
db.query(edit_sql, [edit_obj.filename, edit_obj.id], (err, results) => {if (err) {return console.log(err.message)}if (results.affectedRows === 1) {console.log('更新数据成功')}
})// 更新数据的便捷方式
const edit_obj1 = { id: '13', filename: '马克思主义原理', title: 'cccc' }
const edit_sql1 = 'UPDATE news SET ? WHERE id=?'
db.query(edit_sql1, [edit_obj1, edit_obj1.id], (err, results) => {if (err) {return console.log(err.message)}if (results.affectedRows === 1) {console.log('更新数据成功')}
})// 删除数据
const del_sql = 'DELETE FROM news WHERE id=?'
// 调用db.query()执行SQL语句的同时,为占位符指定具体的值
db.query(del_sql, '15', (err, results) => {if (err) {return console.log(err.message)}if (results.affectedRows === 1) {console.log('删除数据成功')}
})// 标记删除
// 所谓的标记删除,就是在表中设置类似于status这样的状态字段,来标记当前这条数据是否被删除。
const del_sql1 = 'UPDATE news SET status=? WHERE id=?'
db.query(del_sql1, [1, '6'], (err, results) => {if (err) {return console.log(err.message)}if (results.affectedRows === 1) {console.log('标记删除成功')}
})

配合express使用

访问express路由,执行mysql增删改查

const express = require('express')
const mysql = require('mysql')// 创建路由对象
const router = express.Router()// 配置文件
const dbconfig = {host: 'localhost', // 数据库的IP地址port: 3306, // 端口号user: 'root', // 登录数据库的账号password: '123456', // 登录数据库的密码database: 'test' // 指定要操作哪个数据库
}// 查询数据
router.get('/select', (req, res) => {// 连接数据库const conn = mysql.createConnection(dbconfig)conn.query('select * from news', (err, results, fields) => {if (err) throw errconsole.log(results)res.send(results)})conn.end()
})// 插入数据
router.post('/insert', (req, res) => {const data = { id: '06', filename: '孙三', title: '60' }const conn = mysql.createConnection(dbconfig)conn.query('insert into news set ?', data, (err, results) => {if (err) throw errconsole.log(results)res.send(results)})conn.end()
})// 删除数据
router.post('/delete', (req, res) => {const conn = mysql.createConnection(dbconfig)conn.query('delete from news where id = ?', '06', (err, results) => {if (err) throw errconsole.log(results)res.send(results)})conn.end()
})// 更新数据
router.post('/update', (req, res) => {const conn = mysql.createConnection(dbconfig)conn.query('update news set filename = ? where id = ?', ['周九', '05'], (err, results) => {if (err) throw errconsole.log(results)res.send(results)})
})module.exports = router

封装使用

封装连接池,路由访问时调用

const express = require('express')
const mysql = require('mysql')
require('express-async-errors')const app = express()const router = express.Router()// 创建数据库连接池
const pool = mysql.createPool({connectionLimit: 20,host: 'localhost', // 数据库的IP地址port: 3306, // 端口号user: 'root', // 登录数据库的账号password: 'root', // 登录数据库的密码database: 'test' // 指定要操作哪个数据库
})const query = (sql, values = '') => {return new Promise((resolve, reject) => {pool.getConnection((err, connection) => {// err 表示错误信息。 没有错误的时候是一个空值// connection 从连接池中取出的连接对象,可以通过这个对象,去访问数据库if (err) {reject(err)} else {connection.query(sql, values, (err, result) => {if (err) reject(err)else resolve(result)// 将连接归还连接池connection.release()})}})})
}router.get('/content', async (req, res) => {const data = await query(`select * from content where id=?`, [5])console.log(data)res.send(data)
})app.use('/api', router)app.listen(9000, () => {console.log('start server 9000')
})

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript高级程序设计(第四版)--学习记录之迭代器与生成器(下)

生成器 生成器是 ECMAScript 6 新增的一个极为灵活的结构,拥有在一个函数块内暂停和恢复代码执行的能力。 生成器基础 生成器的形式是一个函数,函数名称前面加一个星号表示它是一个生成器。 //生成器函数声明 function* generatorFn(){} //生成器函数表…

网站页面源码,前端页面的最基本组成形式,网页到底是什么? 网站开发教程...

演示网站:gofly.v1kf.com -----------【视频原文案】:现在给大家介绍一下网站上的页面到底是什么。对于我们很多的普通用户来说,他可能不知道一个网站一个页面到底是什么东西。我们来从最基本的开始:如果想新建一个页面&#xff0…

vue3+ts+vite项目中使用spreadjs,通过script标签引入spreadjs可以提高打包速度

https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/quickstart/quickstart-js 右键另存这个官方的示例页面可以下载全部js文件 https://demo.grapecity.com.cn/SpreadJS/WebDesigner/index.html spread.html: <!DOCTYPE html> <html lang"zh">…

共识机制深度解析:PoW、PoS、DPoS和PBFT

区块链的世界里&#xff0c;有一个非常重要的概念叫做“共识机制”。它就像是区块链的心脏&#xff0c;保证大家在这条链上的信息是可靠的、不可篡改的。今天&#xff0c;我们就来通俗易懂地聊聊区块链里的四大共识机制&#xff1a;工作量证明&#xff08;PoW&#xff09;、权益…

数据产品经理知识库构建

概述 数据产品经理是企业中负责管理和推动数据产品的专业人员。他们利用数据来辅助决策&#xff0c;优化产品&#xff0c;提升用户体验。用STAR法则&#xff08;Situation, Task, Action, Result&#xff09;来介绍数据产品经理的角色&#xff0c;应该学习的数据产品&#…

Rust-11-错误处理

Rust 将错误分为两大类&#xff1a;可恢复的&#xff08;recoverable&#xff09;和 不可恢复的&#xff08;unrecoverable&#xff09;错误。对于一个可恢复的错误&#xff0c;比如文件未找到的错误&#xff0c;我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 b…

Labview_网络流

网络流的介绍 网络流是一种易于配置、紧密集成的动态通信方法&#xff0c;用于将数据从一个应用程序传输到另一个应用程序&#xff0c;其吞吐量和延迟特性可与 TCP 相媲美。但是&#xff0c;与 TCP 不同的是&#xff0c;网络流直接支持任意数据类型的传输&#xff0c;而无需先…

Java虚拟机调优技巧及性能监控

Java虚拟机调优技巧及性能监控 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 Java虚拟机&#xff08;JVM&#xff09;作为Java程序的核心执行环境&…

忙忙碌碌的混沌之中差点扑了个空而错过年中这条线

文章目录 前言初见端倪混沌初始力不从心心力交瘁拾遗补缺总结 前言 突然意识到过完这个周末已经7月份了&#xff0c;他预示着我的2024年已经过半了&#xff0c;过年回家仿佛还是昨天的事情&#xff0c;怎么转眼间已经到了年中了。心里还是不愿承认这件事&#xff0c;翻开自己2…

cpu,缓存,辅存,主存之间的关系及特点

关系图 示意图&#xff1a; ------------------- | CPU | | ------------- | | | 寄存器 | | | ------------- | | | L1缓存 | | | ------------- | | | L2缓存 | | | ------------- | | | L3缓存 | | | ------------- | ----…

每日一题——Python实现PAT乙级1073 多选题常见计分法(举一反三+思想解读+逐步优化)9千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 再次尝试 有何不同 版本一&#xff08;原始版本&#xff09;&#xff1a;…

ISO 19110全局要求类中的/req/global/binding-constraints详细解释

/req/global/binding-constraints 要求: 如果模型中包含对绑定实体的约束&#xff0c;则这些约束必须由一个具有字符串值的描述属性的约束实体&#xff08;Constraints entity&#xff09;表示。绑定实体必须通过“constrainedBy”角色链接到这个约束实体。 具体解释 定义 …

修复vcruntime140.dll方法分享

修复vcruntime140.dll方法分享 最近在破解typora的时候出现了缺失vcruntime140.dll文件的报错导致软件启动失败。所以找了一番资料发现都不是很方便的处理&#xff0c;甚至有的dll处理工具还需要花钱&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff0c;我本来就是为…

python实现网页自动化(自动登录需要验证的网页)

引言: python作为实现网页自动化的一个重要工具,其强大的各种封装的库使得程序运行更加简洁,只需要下载相应的库,然后调用库中的函数就可以简便的实现我们想要的网页相关操作。 正文: 我的前几篇文章写了关于初学爬虫中比较容易上手的功能,例如爬取静态网页的数据、动…

ThreadPoolExecutor 工作线程Worker自身锁设计

个人博客 ThreadPoolExecutor 工作线程Worker自身锁设计 | iwts’s blog 总集 想要完整了解下ThreadPoolExecutor&#xff1f;可以参考&#xff1a; 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog Worker-工作线程管理 线程池设计了内部类Worker&#xff0c;主…

【python】python知名品牌调查问卷数据分析可视化(源码+调查数据表)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

CleanShot X - 超好用苹果电脑截图录屏工具

Mac 自带的截图工具十分鸡肋&#xff0c;不仅功能少&#xff0c;无法长截图外&#xff0c;也不支持 GIF 制作&#xff0c;很难满足日常做图需求。 CleanShot X 是一款 Mac 平台近乎无可挑剔的专业截图录屏工具 &#xff0c;能完美代替 Mac 自带截图。它提供超过 50 项功能&…

嵌入式学习——硬件(s3c2440外部中断、定时器中断)——day54

1. start.s preserve8area reset, code, readonlycode32entryldr pc, startnopnopnopnopnop ldr pc, interrupt_handlernopstartldr sp, 0x40001000mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12;IRQbic r0, r0, #(1 << 7);打开IRQ中断允许msr cpsr_c, r0ldr …

【ARM CoreLink 系列 7.1 -- TZC-400 控制器 programmers model】

请阅读【ARM CoreLink 文章专栏导读】 文章目录 TZC-400 programmers modelBuild configuration registerAction registerGate keeper registerSpeculation control registerInterrupt status registerTZC-400 programmers model ARM TZC-400(TrustZone地址空间控制器)是一种…

Nacos配置中心客户端源码分析(一): 客户端如何初始化配置

本文收录于专栏 Nacos 推荐阅读&#xff1a;Nacos 架构 & 原理 文章目录 前言一、NacosConfigBeanDefinitionRegistrar二、NacosPropertySourcePostProcessor三、AbstractNacosPropertySourceBuilder总结「AI生成」 前言 专栏前几篇文章主要讲了Nacos作为服务注册中心相关…