kenx
Knex是一个基于JavaScript的查询生成器,它允许你使用JavaScript代码来生成和执行SQL查询语句。它提供了一种简单和直观的方式来与关系型数据库进行交互,而无需直接编写SQL语句。你可以使用Knex定义表结构、执行查询、插入、更新和删除数据等操作。
官方文档 [link] (Installation | Knex.js中文文档 | Knex.js中文网 (knexjs.cn))
安装和使用
安装:
npm i js-yaml mysql2 knex
js-yaml 用来解析yaml文件,有一些配置,如数据库的密码等,需要存放到yaml里面
mysql2 是依赖的数据库
使用:
-
连接数据库
数据库配置文件
db: host: localhost port: 3306 username: root password: root database: lianxi
const jsYaml = require("js-yaml"); const fs = require("fs"); const knex = require("knex"); const path = require("node:path"); const yaml = fs.readFileSync(path.resolve(process.cwd(),"./utils/knex/db.config.yaml"),"utf8"); const config = jsYaml.load(yaml).db; const db = knex({ client: "mysql2", connection: { host: config.host, user: config.username, password: config.password, database: config.database }, pool: {max: 7,min: 2} }); module.exports = db;
-
使用(增删改查)
import express from 'express' import db from "./kenx/dbUtils.js" 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}`) })
-
事务
你可以使用事务来确保一组数据库操作的原子性,即要么全部成功提交,要么全部回滚
例如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() //回滚事务 } })
prisma
介绍
Prisma 是一个现代化的数据库工具套件,用于简化和改进应用程序与数据库之间的交互。它提供了一个类型安全的查询构建器和一个强大的 ORM(对象关系映射)层,使开发人员能够以声明性的方式操作数据库。
Prisma 支持多种主流数据库,包括 PostgreSQL、MySQL 和 SQLite,它通过生成标准的数据库模型来与这些数据库进行交互。使用 Prisma,开发人员可以定义数据库模型并生成类型安全的查询构建器,这些构建器提供了一套直观的方法来创建、更新、删除和查询数据库中的数据。
Prisma 的主要特点包括:
-
类型安全的查询构建器:Prisma 使用强类型语言(如 TypeScript)生成查询构建器,从而提供了在编译时捕获错误和类型检查的能力。这有助于减少错误,并提供更好的开发人员体验。
-
强大的 ORM 层:Prisma 提供了一个功能强大的 ORM 层,使开发人员能够以面向对象的方式操作数据库。它自动生成了数据库模型的 CRUD(创建、读取、更新、删除)方法,简化了与数据库的交互
安装和使用
-
安装 Prisma CLI:
使用 npm 安装:运行
npm install -g prisma
-
初始化项目
- 使用
prisma init --datasource-provider mysql
- 使用
-
连接mysql
例子:
- 修改.env文件
[DATABASE_URL="mysql://账号:密码@主机:端口/库名"]
DATABASE_URL="mysql://root:123456@localhost:3306/library"
- 修改.env文件
创建表
prisma/schema.prisma
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model Post {
id Int @id @default(autoincrement())
title String
publish Boolean @default(false)
// 设置外键
author User @relation(fields: [authorID],references: [id])
authorID Int
}
model User {
id Int @id @default(autoincrement())
userName String @unique
passWord String
posts Post[]
}
执行命令 创建表
prisma migrate dev
然后就会生成package.json和node_modules
然后tsc --init生成ts配置文件
然后安装express就可以使用了‘
使用
const express = require("express");
const { PrismaClient } = require('@prisma/client')
const bodyParser = require('body-parser');
const app = express()
const prisma = new PrismaClient()
// 解析www-url编码的数据
app.use(bodyParser.urlencoded({
extended: true
}))
type resType = {
send: (arg: any) => void
}
type reqType = {
body: {
userName?: string;
passWord?: string;
title?: string;
postID?: string;
}
params: {
id?: string
}
}
// 添加
app.post("/create",async (req:reqType, res: resType) => {
let {userName,passWord} = req.body;
if(!userName || !passWord){
res.send("用户名或密码不能为空");
return;
}
let data = await prisma.user.create({
data:{
userName,
passWord,
posts: {
create: [
{
title: "Hello World"
},
{
title: "Hello World2"
}
]
}
}
})
res.send(data)
})
// 查询
app.get("/find",async (req: any, res: resType) => {
let data = await prisma.user.findMany({
include: {
posts:true
}
})
res.send(data)
})
// 单个查询
app.get("/findOne/:id",async (req: reqType, res: resType) => {
if(!req.params.id){
res.send("id不能为空");
return;
}
let data = await prisma.user.findMany({
where: {
id: Number(req.params.id)
},
include: {
posts:true
}
})
res.send(data)
})
// 更新
app.post("/update",async (req: reqType,res: resType) => {
if(!req.body.postID || !req.body.title){
res.send("postID和title不能为空");
return;
}
let data = await prisma.post.update({
where: {
id: Number(req.body.postID)
},
data: {
title: req.body.title
}
})
res.send(data)
})
// 删除
app.delete("/delete/:id",async (req: reqType, res: resType) => {
if(!req.params.id){
res.send("id不能为空");
return;
}
let data = await prisma.post.delete({
where: {
id: Number(req.params.id)
}
})
res.send(data)
})
app.listen(3000, () => {
console.log("Server is running on port 3000");
});