学习node.js 九 ORM knex,prisma

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 是依赖的数据库

使用:

  1. 连接数据库

    数据库配置文件

    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;
    
    
  2. 使用(增删改查)

    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}`)
    })
    
    
  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() //回滚事务
        }
       
    })
    
    

prisma

介绍

Prisma 是一个现代化的数据库工具套件,用于简化和改进应用程序与数据库之间的交互。它提供了一个类型安全的查询构建器和一个强大的 ORM(对象关系映射)层,使开发人员能够以声明性的方式操作数据库。

Prisma 支持多种主流数据库,包括 PostgreSQL、MySQL 和 SQLite,它通过生成标准的数据库模型来与这些数据库进行交互。使用 Prisma,开发人员可以定义数据库模型并生成类型安全的查询构建器,这些构建器提供了一套直观的方法来创建、更新、删除和查询数据库中的数据。
Prisma 的主要特点包括:

  1. 类型安全的查询构建器:Prisma 使用强类型语言(如 TypeScript)生成查询构建器,从而提供了在编译时捕获错误和类型检查的能力。这有助于减少错误,并提供更好的开发人员体验。

  2. 强大的 ORM 层:Prisma 提供了一个功能强大的 ORM 层,使开发人员能够以面向对象的方式操作数据库。它自动生成了数据库模型的 CRUD(创建、读取、更新、删除)方法,简化了与数据库的交互

安装和使用

  1. 安装 Prisma CLI:

    使用 npm 安装:运行 npm install -g prisma

  2. 初始化项目

    • 使用prisma init --datasource-provider mysql
  3. 连接mysql

    例子:

    • 修改.env文件 [DATABASE_URL="mysql://账号:密码@主机:端口/库名"]
    DATABASE_URL="mysql://root:123456@localhost:3306/library"
    
创建表

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");
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值