3 node操作数据库

devtools/2024/10/18 19:24:35/

传统和orm型的方式操作数据库的区别

  •  传统的方式

        mysql2库 用来连接mysql和编写sql语句编写不方便也会有sql注入的风险

Knex是一个基于JavaScript的查询生成器,它允许你使用JavaScript代码来生成和执行SQL查询语句。它提供了一种简单和直观的方式来与关系型数据库进行交互,而无需直接编写SQL语句。你可以使用Knex定义表结构、执行查询、插入、更新和删除数据等操作。

knexjs.org/guide/query…

 Prisma 是一个现代化的数据库工具套件支持ts很友好,用于简化和改进应用程序与数据库之间的交互。它提供了一个类型安全的查询构建器和一个强大的 ORM(对象关系映射)层,使开发人员能够以声明性的方式操作数据库
Prisma 支持多种主流数据库,包括 PostgreSQL、MySQL 和 SQLite,它通过生成标准的数据库模型来与这些数据库进行交互。使用 Prisma,开发人员可以定义数据库模型并生成类型安全的查询构建器,这些构建器提供了套直观的方法来创建、更新、删除和查询数据库中的数据。
Prisma 的主要特点包括:

类型安全的查询构建器:Prisma 使用强类型语言(如 TypeScript)生成查询构建器,从而提供了在编译时捕获错误和类型检查的能力。这有助于减少错误,并提供更好的开发人员体验。
强大的 ORM 层:Prisma 提供了一个功能强大的 ORM 层,使开发人员能够以面向对象的方式操作数据库。它自动生成了数据库模型的 CRUD(创建、读取、更新、删除)方法,简化了与数据库的交互。
数据库迁移:Prisma 提供了数据库迁移工具,可帮助开发人员管理数据库模式的变更。它可以自动创建和应用迁移脚本,使数据库的演进过程更加简单和可控。
性能优化:Prisma 使用先进的查询引擎和数据加载技术,以提高数据库访问的性能。它支持高级查询功能,如关联查询和聚合查询,并自动优化查询以提供最佳的性能

1 mysql2操作数据库

下载依赖

npm install mysql2 express js-yaml

  1. mysql2 用来连接mysql和编写sq语句
  2. express 用来提供接口 增删改差
  3. js-yaml 用来编写配置文件

数据库配置 vscode数据库可视化插件可使用Database client,本地需安装mysql

代码:

db.config.yaml:

db:host: localhost #主机port: 3306 #端口user: root #账号password: '123456' #密码 一定要字符串database: test # 库

app.js:

import mysql2 from 'mysql2/promise'
import fs from 'node:fs'
import jsyaml from 'js-yaml'
import express from 'express'
const yaml = fs.readFileSync('./db.config.yaml', 'utf8')
const config = jsyaml.load(yaml)
const sql = await mysql2.createConnection({ //连接数据库...config.db
})
const app = express()
app.use(express.json())
//查询接口 全部
app.get('/',async (req,res)=>{const [data] = await sql.query('select * from user')res.send(data)
})
//单个查询 params
app.get('/user/:id',async (req,res)=>{const [row] = await sql.query(`select * from user where id = ?`,[req.params.id])res.send(row)
})//新增接口
app.post('/create',async (req,res)=>{const {name,age,hobby} = req.bodyawait sql.query(`insert into user(name,age,hobby) values(?,?,?)`,[name,age,hobby])res.send({ok:1})
})//编辑
app.post('/update',async (req,res)=>{const {name,age,hobby,id} = req.bodyawait sql.query(`update user set name = ?,age = ?,hobby = ? where id = ?`,[name,age,hobby,id])res.send({ok:1})
})
//删除
app.post('/delete',async (req,res)=>{await sql.query(`delete from user where id = ?`,[req.body.id])res.send({ok:1})
})
const port = 3000app.listen(port, () => {console.log(`Example app listening on port ${port}`)
})

2 orm框架knex操作数据库

下载依赖

npm install knex express js-yaml

db.config.yaml 同上配置 

app.js

import fs from 'node:fs'
import jsyaml from 'js-yaml'
import express from 'express'
import knex from 'knex'
const yaml = fs.readFileSync('./db.config.yaml', 'utf8')
const config = jsyaml.load(yaml) //类似转义或解码的操作
const db = knex({client: "mysql2",connection: config.db
})//创建表 
/* db.schema.createTableIfNotExists('list', (table) => { table.increments('id') //id自增table.integer('age') //age 整数table.string('name') //name 字符串table.string('hobby') //hobby 字符串table.timestamps(true, true) //创建时间和更新时间
}).then(() => {console.log('创建成功')
}) */const app = express()
app.use(express.json())
//查询接口 全部
app.get('/', async (req, res) => {const data = await db('list').select().orderBy('id', 'desc')const total = await db('list').count('* as total')res.json({code: 200,data,total: total[0].total,})
})
//单个查询 params
app.get('/user/:id', async (req, res) => {const row = await db('list').select().where({ id: req.params.id })res.json({code: 200,data: row})
})//新增接口
app.post('/create', async (req, res) => {const { name, age, hobby } = req.bodyconst detail = await db('list').insert({ name, age, hobby })res.send({code: 200,data: detail})
})//编辑
app.post('/update', async (req, res) => {const { name, age, hobby, id } = req.bodyconst info = await db('list').update({ name, age, hobby }).where({ id })res.json({code: 200,data: info})
})
//删除
app.post('/delete', async (req, res) => {const info = await db('list').delete().where({ id: req.body.id })res.json({code: 200,data: info})
})
const port = 3000app.listen(port, () => {console.log(`Example app listening on port ${port}`)
})

index.http 方便测试接口

# 添加数据
POST http://localhost:3000/create HTTP/1.1
Content-Type: application/json{"name":"张三","age":18
}# 查询全部
#  GET http://localhost:3000/ HTTP/1.1# 单个查询
# GET http://localhost:3000/user/2 HTTP/1.1# 更新数据
# POST http://localhost:3000/update HTTP/1.1
# Content-Type: application/json# {
#     "name":"法外狂徒",
#     "age":20,
#     "id":23
# }#删除
# POST http://localhost:3000/delete HTTP/1.1
# Content-Type: application/json# {
#     "id":24
# }

3 事务

你可以使用事务来确保一组数据库操作的原子性,即要么全部成功提交,要么全部回滚

例如A给B转钱,需要两条语句,如果A语句成功了,B语句因为一些场景失败了,那这钱就丢了,所以事务就是为了解决这个问题,要么都成功,要么都回滚,保证金钱不会丢失。

//伪代码
db.transaction(async (trx) => {try {await trx('list').update({money: -100}).where({ id: 1 }) //Aawait trx('list').update({money: +100}).where({ id: 2 }) //Bawait trx.commit() //提交事务}catch (err) {await trx.rollback() //回滚事务}})


http://www.ppmy.cn/devtools/95112.html

相关文章

LVS负载均衡集群

LVS负载均衡集群 GPT生成的LVS介绍 1. 实验环境: 调度器(Director Server):server1(192.168.228.11 192.168.228.100) 真实服务器(Real Server):server3(…

Java-自定义注解(定义更复杂的自定义注解,例如带有多个成员变量的注解使用讲解)

在Java中,定义更复杂的自定义注解可以让你在代码中添加丰富的元数据,从而让编译器或运行时 工具能够根据这些元数据做出相应的处理。下面我将详细介绍如何定义一个带有多个成员变量的自 定义注解,并给出一些示例代码。 1. 定义自定义注解 定义一个自定义注解,其中包含多…

Python离线批量安装依赖包

查看依赖 pip list 1.生成依赖包列表。把当前依赖生成列表写入txt文件 pip freeze > requirements.txt 2.下载依赖包到当前目录 创建packages目录存放依赖包 mkdir packages 下载依赖 pip3 download -d packages -r requirements.txt 注:下载太慢时&…

部署本地生活服务平台源码,必须要知道的三个问题

当前,多家互联网大厂在本地生活板块的布局力度持续加大,使得越来越多想做本地生活服务商的创业者看到了它们拿下本地生活市场的野心和绝不放宽本地生活服务商申请门槛的决心,进而计划着通过本地生活服务平台源码部署完成入局。 为了能够提高…

HTML中的<fieldset>标签元素框的使用

HTML 提供的 <fieldset> 标签用于在表单中分组相关元素。 <fieldset> 标签会在相关元素周围绘制一个框。 <legend> 标签为 fieldset 元素定义标题。 语法如下&#xff1a; <fieldset><legend>标题</legend><!-- 元素内容... -->…

Sentinel入门与进阶:微服务流量控制的最佳实践 ( 五 )

7. 熔断降级 Sentinel除了流量控制以外&#xff0c;对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。 Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时&#xff08;例如调用超时或异常比例升高&#xff09;&#xff0c;对这个资源的调用进行限…

分享一个基于SpringBoot的戏剧戏曲科普平台的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

OpenCV图像滤波(11)中值滤波medianBlur函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 该函数使用中值滤波器对图像进行模糊处理。 该函数采用 ksizeksize 的窗口尺寸对图像进行平滑处理。对于多通道图像&#xff0c;每个通道将被独…