首页 > 数据库 >3 node操作数据库

3 node操作数据库

时间:2024-08-13 16:24:48浏览次数:13  
标签:node const res 数据库 req 操作 app id

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

  •  传统的方式

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

  •  orm的方式

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.body
    await 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.body
    await 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 = 3000

app.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.body
  const 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.body
  const 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 = 3000

app.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 }) //A
        await trx('list').update({money: +100}).where({ id: 2 }) //B
        await trx.commit() //提交事务
    }
    catch (err) {
        await trx.rollback() //回滚事务
    }
   
})

标签:node,const,res,数据库,req,操作,app,id
From: https://blog.csdn.net/qq_37550440/article/details/141165734

相关文章

  • Springboot计算机毕业设计基于+Vue的自媒体系统+程序+源码+数据库
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,广告分类,广告展示,广告投放,商家开题报告内容一、研究背景与意义随着互联网技术的飞速发展,自媒体已成为信息传播的重要渠道之一。自媒体平台不仅为用户提......
  • LVGL--无操作系统移植
    1、添加lvgl库到mdk工程①在工程中建立文件结构,如下:  ②把lvgl_v8.2库中需要的文件copy到“LVGL_test\Middlewares\LVGL\GUI\lvgl”下 ③“lv_conf.h”文件的条件编译指令#if0修改成#if1 ④打开mdk工程先编译,然后新建Groups,把前面copy的文件添加到工程中然后......
  • Chapter 34 PyMySQL 基本操作指南
    欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!文章目录前言一、基本操作步骤二、综合案例分析前言在现代应用开发中,与数据库的高效交互是关键的一环。对于使用Python语言的开发者来说,PyMySQL是一个非常实用的工具,它提供了一个简洁且功能强......
  • prometheus监控mysql数据库
    监控需要安装一个工具mysqld_exportermysqld_exporter-0.14.0.linux-386.tar.gz上传到服务器后,解压压缩包tar-zxvf mysqld_exporter-0.14.0.linux-386.tar.gzcd mysqld_exporter-0.14.0.linux-386touchmy.cnfvimy.cnf加入有权限的用户名,密码,数据库地址等信息。[cli......
  • 【YashanDB数据库】YashanDB如何回收表空间
    确认表空间高水位线,是否有可回收空间。selecta.tablespace_name,a.high_water_mark,b.user_bytes,b.total_bytesfrom(SELECTtablespace_name,max(header_block+blocks)*8192AShigh_water_markFROMdba_segmentsWHEREtablespace_name='USERS'GROUPBYtablespace_n......
  • 使用nvm切换Node.js版本
    一、安装nvmnvm(NodeVersionManager)是一个用于管理Node.js版本的工具,它允许你在同一台机器上安装和切换多个Node.js版本。1.安装nvm    https://github.com/coreybutler/nvm-windows  访问以上链接到github去下载 点击releases         下载......
  • mysql: 用户权限的操作
    一,查看mysql内置的权限有哪些?SHOWPRIVILEGES;如图:二,管理给用户的权限1,授予权限:mysql>GRANTSELECT,INSERT,DELETE,UPDATEONnews.*TO'laoliu'@'127.0.0.1';QueryOK,0rowsaffected(0.01sec)2,查询指定用户有哪些权限?mysql>showgrantsfor'laoliu'......
  • Windows出现出现身份验证错误。要求的函数不受支持 远程计算机: 10.17.1.2 这可能是由
    Windows出现出现身份验证错误。要求的函数不受支持远程计算机:10.17.1.2这可能是由于CredsSP加密数据库修正。若要了解详细信息,请访问https://go.microsoft.com/fwlink/?linkid=866660解决方案解决方法第一步点开控制面板选择系统与安全第二步选择“允许远程访问......
  • pbootcms网站是使用sqlite数据库好还是使用mysql数据库好?
    众多周知pbootcms程序支持sqlite数据库和mysql数据库,目前默认常用最多的是sqlite数据库,有需要转成mysql数据库的可以联系我们。pbootcms数据库sqlite无缝转换mysql数据库 本人从接触pbootcms开始一直都是使用mysql数据库,很少出现被黑和各种不明原因报错。建议有条件的朋友尽量......
  • Oracle数据库US7ASCII字符集中文乱码
    最近遇到一家客户的Oracle数据库,版本是11g,字符集是US7ASCII,当使用PL/SQLDeveloper工具插入和查询中文时都没问题,但是Java程序使用JDBC插入和查询中文时,中文乱码。比如'a中文b'通过JDBC查询出来的乱码是这样的'aᅱ￐ᅫᅣb'查询了一些资料,看到有网友通过这种方式解决了(只列出关键代码)。......