mysql+express+yaml

本文介绍了如何使用Node.js、npm、Express、js-yaml等技术进行MySQL数据库操作,包括安装依赖、配置文件、创建Express应用、使用Knex和PrismaORM进行CRUD操作以及事务管理。
摘要由CSDN通过智能技术生成

第一步 安装mysql依赖:

npm install mysql2

第二步 安装express:

npm install express

第三步 安装js-yaml

npm install js-yaml

第四步:修改package.json

将package.json的type改为module 是ESM的语法

第五步:index.js

项目根目录创建一个 db.config.yaml 的文件 代码如下

db:
    user:root
    
    password:'123456'

    host:localhost

    port:3306

    database:xiaoman


index.js文件中的代码 

import mysql2 from 'mysql2/promise'

import fs from 'fs'

import jsyaml from 'js-yaml'

import  express from 'express'

const yaml = rs.readFileSync('./db.config.yaml','utf8')

const config = jsyaml.load(yaml)

mysql2.createConnection({

    host:'',
    
    user:'',
    
    password:'',

    database:'',


})

const sql = await mysql2.createConnection({...config.db}) // 替代上面的配置

const app = express()

// 查询全部的接口

app.get('/',async(req,res)=>{

    const [data] = await sql.query('select * from user')// 返回值是[[],[]]然后结构

    res.send(data)

})

// 单个查询

app.get('/user/:id',async(req,res)=>{

    const [data] = await sql.query(`select * from user where id=${req.params.id}`)

    const [data] = await sql.query(`select * from user where id=?`,[req.params.id])

    res.send(data)

})

// 新增接口

app.post('/create',async(req,res)=>{

    const {name,age,hobby} = req.body

    await sql.query(`insert into use(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=?,bobby=? 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.lister(port,()=>{

    console.log(`http://localhost:${port}`)
})

Knex的使用:作用操作数据库

安装 npm i mysql2  ; npm u knex;

使用: import  knex from 'knex'

链接数据库使用knex;

const db = knex({client:'mysql2', connection:config.db})

使用knex创建表和字段

db.schema.createTableIfNotExists('list',table=>{

       table.increments('id')  id主键 自增

        table.integer('age')  整数

        table.string('name') 字符串

        table.string('bobby' ) 字符串

        table.timestamps(true,true) 创建时间 更新时间

}).then(()=>{console.log('创建成功')})

插入数据的语句 

app.post('/create',async(req,res)=>{

    const {name,age,hobby,id} = req.body

    await db('list').select() // 查询全部

    await  db('list').select().where({id:req.body.id}) // 根据id查询单个数据

    await  db('list').select().delete({id:req.body.id}) // 根据id删除单个数据

    await db('user').select().leftJoin('table','user.id','table.user_id') // 连表查询

    await db('list').count('* as total') // 查询所有条数 [{total:10}]

    await db('list').select().order('id','desc') // id倒叙排列

    await db('list').insert({name,age,hobby}) // 新增

    await db('list').update({name,age,hobby}).where({id}) // 更新

什么是事务:保持事情的一致性要么都成功要么都失败,

比如:A给B转100  A需要减100, B增100, 假设a给b转了,a减了100,但是数据库短开了那么b就没有加上,那么就出大问题了。

db.transaction(async trx={
        
        try{

              await trx('list').update({money:-100}).where({id:1})

              await trx('list').update({money:+100}).where({id:2})

              await trx.commit()  提交事务

        }catch(err){
                await trx.rollback() 回滚事务
        }
}).then(()=>{}).catch(res=>{})

    res.send({ok:1})

})

什么是prisma?企业级的框架,

第一步进行安装 npm i prisma -g

第二步创建一个目录在目录中执行:prisma init -h;查看相关的命令

第三步创建项目执行:prisma init --datasource-provider mysql, 使用mysql数据库

第四步创建完项目之后,查看.env的文件:

DATABASE_URL="mysql://johnode:randomapassword@localhost:3306/mydb" 

mysql://账号:密码@主机:端口号/数据库名称

第五步:prisma/schema.prisma目录用来编写表结构:

generator client {provider="prisma-client-js"}

datasource db {provider="mysql"   url = env("DATABASE_URL")}

这个文件编写表结构: User Post两个表

model Post {  文章表
        id: Int @id @default(autoincrement())  id自增
        title String
        content  String
        author User @relation(fields:[authorId],references:[id])  关联下面的User表
        authorId Int
}

model User{  用户表 一个用户可以发多个文章 一对多
         id: Int @id @default(autoincrement())  id自增
        name String
        email String @unique  唯-
        posts Post[] 一对多的关系

}

第六步 执行命令 prisma migrate dev

第七步 项目中新建一个src目录

第八步 执行 tsc --init 生成ts的配置文件, npm i  typescript -g ; npm i ts-node -g;

第九步 src/app.ts    npm i express   npm i --save-dev @type/express

import  express from 'express'

import {PrismaClient} from '@prisma/client'

const  prisma = new PrismaClient()

const app = express()

app.use(express.join())  // 支持post

// 新增数据的接口

app.post('/create',async(req,res)=>{

        const {name,email} = req.body

       const data =  await prosma.user.create({

                data:{

                        name:name,
                        
                        email:email,

                        posts:{  // 在这里还可以给posts表添加数据

                                create:[   // 如果是单条数据 就是对象 多条数据就是数组
                                        
                                        {title:'文章标题',content:'文章的内容' },

                                        {title:'文章标题2',content:'文章的内容' }
                                ]

                        }
                        
                 }
        })
        res.send(data)
})

查询数据的接口

app.get('/',async(req,res)=>{

        const data = await prisma.user.findMany()

        res.send(data)
})

app.get('/',async(req,res)=>{ // 把文章表的也一块查询出来

        const data = await prisma.user.findMany({

                includes:{posts:true}
        })

        res.send(data)
})

单条查询

app.get('/user:id',async(req,res)=>{ // 把文章表的也一块查询出来

        const data = await prisma.user.findMany({

                where:{id:Number(req.params.id)]
        })

        res.send(data)
})

编辑数据

app.post('/update',async(req,res)=>{
        
        const {name,email,id} = req.body
        
        await prisma.user.update({
                
                data:{
                        name,
                        email
                },
                
                where:{
                        id:Number(id)
                }
        })

})

删除数据:  删除user的id, 但是因为posts文章的数据关联到了user的id 所以需要先删posts的数据

app.post('/delete',aysnc(req,res)=>{


        await prisma.post.deleteMany({

                where:{

                        authorId:Number(req.body.id)
                }
        })

        await prisma.user.delete({
                
                where:{

                        id:Number(req.body.id)
                }
        })

})

const port = 3000

app.listen(port,()=>{console.log('http://localhost:3000')})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值