Koa操作MySQL

一、Koa简介

​ koa是一个基于Node.js的框架,主要用于构建Web应用程序。它具有灵活性和可扩展性而闻名,支持中间件化开发,可以轻松构建API、路由、组件等。

主要特点如下:

	1. 轻量: koa将Router单独抽离出来封装成库,使用时需要进行安装,因此比express更加轻量
	2. 灵活: koa是采用插件话设计的,因此可以很方便的添加新的功能和扩展原有的功能。
	3. 可扩展性强: koa支持路由和中间件设计,可以很方便的添加新的路由和中间件
	4. 安全: koa提供了良好的安全支持,包括验证、授权、跨站脚本攻击等
	5. 兼容性: koa可以与express进行集成,提供了方便的集成方案
	6. 稳定:由Node.js官方支持,具有良好的稳定性和可靠性

与Express进行对比

  1. 轻量: koa将许多小模块都单独剥离,因此相较于Express更加轻量

  2. 中间件使用的差异:

    Express的中间件是链式调用: 当前中间件执行完毕之后放行至下一个中间件,下一个中间件执行完毕再放行至后面的中间件,重复此过程一直到执行所有的中间件给前端返回数据。

    Koa采用了洋葱模型设计:Koa 采用洋葱模型设计使得路由更加灵活、职责更加明确、代码更加可维护和可扩展,提高了应用程序的可维护性和可扩展性

二、MySQL的简介和使用

简介

MySQL是一种关系型数据库管理系统(RDBMS),由MySQL AB开发。MySQL是目前使用最广泛的RDBMS,占市场份额的大约80%。

MySQL具有以下优点:

  1. 快速读写:MySQL支持事务处理,支持外键引用和索引,使得数据读写速度非常快。
  2. 支持多用户:MySQL可以支持多个用户同时访问,每个用户都可以有自己的账户和密码。
  3. 可扩展性:MySQL支持主从复制和分区,可以方便地扩展数据库的存储和处理能力。
  4. 支持SQL:MySQL支持SQL语句,可以方便地进行数据库操作和查询。
  5. 开源免费:MySQL是开源免费的,可以在自己的服务器上免费安装和运行。

总的来说,MySQL是一款功能强大、速度快、支持多用户、可扩展性好、支持SQL语句的关系型数据库管理系统,被广泛应用于Web应用程序的开发

与MongoDB 的对比

mysql和mongoDB是两种不同的关系型数据库管理系统(RDBMS)和文档型数据库管理系统(DBM),具有各自的优势和适用场景。

MySQL是一种关系型数据库管理系统,主要适用于读写操作较多的场景,尤其适用于InnoDB存储引擎。MySQL具有高速读写、事务处理、外键引用、索引等特性,支持多用户并发访问,可以处理大量数据。此外,MySQL还可以在多个服务器上进行数据同步,以提高数据可用性。

MongoDB是一种文档型数据库管理系统,主要适用于非结构化数据的存储和实时数据的处理。MongoDB支持灵活的文档结构,可以支持嵌套对象、数组和字段。MongoDB还支持高效的查询和聚合操作,可以轻松地处理复杂的查询场景。此外,MongoDB还支持数据的可扩展性和高可用性,可以轻松地在多个服务器上进行数据同步。

总的来说,MySQL适合用于需要高速读写、事务处理和大量数据处理的场景,而MongoDB适合用于需要灵活文档结构、实时数据处理和复杂查询场景的场景。

主要概念
  1. 数据库连接:用于将应用程序与数据库进行通信,是MySQL中非常重要的组件。
  2. 数据库表:用于存储数据,是MySQL中的基本数据结构。
  3. 数据库行:用于表示数据库表中的一行数据,包括字段名称和数据值等。
  4. 数据库字段:用于定义数据库表中的字段名和数据类型,是MySQL中的一个非常重要的概念。
  5. 数据库事件:用于处理数据库操作中的异常情况,例如:插入、更新、删除等操作失败的情况。
  6. SQL语句:用于在MySQL中执行查询、修改、删除等操作,是MySQL中非常重要的一个工具。
  7. 数据备份:用于将数据进行备份,以防止数据丢失或者损坏。
  8. 数据恢复:用于将备份的数据进行恢复,以恢复数据到之前的状态。
  9. 索引:用于提高数据库的查询速度,通过索引可以快速定位到需要查询的数据。
  10. 事务:用于保证多个SQL语句同时执行的正确性,是MySQL中的一个非常重要的概念。
  11. 数据库安全性:用于保护数据库的安全,包括用户密码、权限控制等。
主键和外键

​ 主键和外键是MySQL中关系型数据库表中非常重要的概念。

​ 主键(Primary Key)是用于唯一标识数据库表中每一行数据的列。一个表中可以有多个主键,但每个主键必须唯一。主键可以由一个或多个列组成。

​ 外键(Foreign Key)是用于连接两个表的列。一个表的外键可以引用另一个表中的主键。通过外键,可以建立表与表之间的关系,从而实现数据之间的关联。

在MySQL中,一个表只能有一个主键,用于唯一标识每一行数据。主键的作用是确保数据的唯一性和快速检索。每个表都应该有一个主键来确保数据的完整性和一致性。

然而,在某些情况下,可能会遇到需要在表中定义多个字段作为唯一标识的需求。为了满足这种需求,MySQL提供了复合主键(composite primary key)的概念。复合主键由多个列组成,它们的组合值必须唯一。

为什么要设计复合主键呢?以下是一些可能的原因:

  1. 数据库模型需要跨多个字段来唯一标识一行数据。例如,在学生选课系统中,可以使用学生ID和课程ID作为复合主键,以标识某个学生选择某门课程的记录。

  2. 避免引入额外的唯一索引。如果没有复合主键,为了实现多个字段的唯一性约束,可能需要创建额外的唯一索引。而使用复合主键,可以利用主键索引来实现这个目的,避免了额外的索引创建和存储开销。

  3. 方便查询和连接操作。复合主键的存在可以使得基于多个字段的查询和连接操作更加方便和高效。

需要注意的是,使用复合主键也可能带来一些限制和挑战。例如,复合主键在定义时需要慎重考虑字段的选择和顺序,以确保唯一性和查询效率。此外,复合主键的长度可能较长,会对存储和索引的性能产生一定影响。

因此,在设计数据库模型时,需要根据实际需求和业务逻辑来决定是否使用复合主键。在大多数情况下,一个单独的主键通常就足够满足需求。只有在确实存在需要多个字段组合成唯一标识的情况下,才考虑使用复合主键。

使用

MySQL可以通过SQL语句来进行操作,常见的SQL语句如下:(增删改查)

// 插入:
INSERT INTO student (`name`,`score`,`sex`,`class_id`,`age`,create_time) VALUES ('test',100,'male',2,18,NOW())
// 更新:
 UPDATE student SET `name` = 'test2'WHERE id = 7
// 删除:
DELETE FROM student WHERE name='test2'
			
// 查询:
// 查询所有:
SELECT * FROM student
// 按照字段查询: 
SELECT `name`,`score`,`sex` from student
// 条件查询:
SELECT  * FROM student WHERE sex = 'male' AND score > 100 //(通过AND连接条件)
// 模糊查询: 
SELECT  * FROM student WHERE `name` LIKE '%3%' //(名称中包含3的,用like查询)
SELECT  * FROM student WHERE `name` LIKE '3%' //(名称中第一个字母是3的)
SELECT  * FROM student WHERE `name` LIKE '%3' //(名称中最后一个字母是3的)
// 排序:  
SELECT  * FROM student ORDER BY score // (正向排序 小->大)
SELECT  * FROM student ORDER BY score DESC //(反向排序 大->小)
// 分页查询:
SELECT  * FROM student ORDER BY score DESC  LIMIT 2 OFFSET 2 //(limit是条数,offset是每页的索引: OFFSET的值是(页数 - 1) * 条数)
// 记录条数: 
SELECT  COUNT(*) total FROM student  //total是自定义的
// 多表联查:
// 笛卡尔查询:
SELECT  * FROM student, class(结果是目标表的行数的乘积)
 // 联表查询:
   //表示在student,class下面寻找student.class_id = class.id的数据,并返回student.id,name和class.name
SELECT student.`name`,student.class_id,class.name FROM student INNER JOIN class ON student.class_id = class.id 
SELECT s.`name`,s.class_id,c.name FROM student s INNER JOIN class c ON s.class_id = c.id //设置别名: s,c,实现的功能与上文相同
SELECT s.`name` sname,s.class_id,c.name cname FROM student s INNER JOIN class c ON s.class_id = c.id //重命名: sname,cname

三、Koa操作MySQL

1.安装mysql2插件:

npm i mysql2

2.连接数据库进行操作

const mysql2 = require('mysql2')
function getDbConfig(){
    return{
        host:'10.45.126.221', //数据库地址
        port:'3306',//端口
        user:'root', // 用户名
        password:'123456', // 密码
        database:'cjtest', //要连接的数据库
        connectionLimit:1
    }
}

// 查询
router.get('/',async (ctx,next) => {
    //   创建连接池
    const config = getDbConfig()
    const promisePool = mysql2.createPool(config).promise()
    const name = 'test'
    const sex = 'male'
    // const users = await promisePool.query("select * from student order by score limit 2 offset 0")
    //带参数:模板字符串一定要保留双引号
    // const users = await promisePool.query(`select * from student where name = "${name}" order by score limit 2 offset 0`)
    //多个参数查询
    const users = await
        promisePool.query(`select * from student where name = ? and sex = ?order by score limit 2 offset 0`,
        [name,sex])
    console.log({users})
    ctx.body={
        ok:1,
        data: users[0]
    }
})

// 插入
router.get('/create',async (ctx,next) => {
    //   创建连接池
    const config = getDbConfig()
    const promisePool = mysql2.createPool(config).promise()
    const name = 'test'
    const sex = 'male'
    const users = await
        promisePool.
        query(`insert into student (name, sex, score, class_id,age,create_time) values (?,?,?,?,?,?)`,
            [name,sex,70, 1,12,'2023-09-06 16:40:55'])
    console.log({users})
    ctx.body={
        ok:1,
        data: users[0]
    }
})

//更新
router.get('/update',async (ctx,next) => {

    //   创建连接池
    const config = getDbConfig()
    const promisePool = mysql2.createPool(config).promise()
    const name = 'test'
    const sex = 'male'
    const users = await
        promisePool.
        query(`update student set name=? ,score=? where id=?`,
            ['updateTest',99,15])
    console.log({users})
    ctx.body={
        ok:1,
        data: users[0]
    }
})

//删除
router.get('/del',async (ctx,next) => {

    //   创建连接池
    const config = getDbConfig()
    const promisePool = mysql2.createPool(config).promise()
    const name = 'test'
    const sex = 'male'
    const users = await
        promisePool.
        query(`delete from student where id=?`,
            [15])
    console.log({users})
    ctx.body={
        ok:1,
        data: users[0]
    }
})
module.exports 

对于不同的业务,需要更改query中的sql语句。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值