当前位置: 首页 > news >正文

【koa】05-koa+mysql实现数据库集成:连接和增删改查

前言

前面我们已经介绍了第二阶段的第1-4点内容,本篇介绍第5点内容:数据库集成(koa+mysql)

也是第二阶段内容的完结。

一、学习目标

在koa项目中正常连接数据库,对数据表进行增删改查的操作。

二、操作步骤

本篇文章会使用到:koa+sequelize+mysql+apipost(用于测试http方法)

注意:文章很多的操作步骤和“express框架的数据库集成”基本上是一样的,参考文章:

【express-generator】09-连接和使用数据库-CRUD 操作(第二阶段完结)-CSDN博客

所以文章中会简单跳过/省略一些简单的步骤。

1、安排依赖

在项目根目录下运行以下命令安装必要的依赖:

npm install koa mysql2 sequelize koa-router koa-bodyparser

 2、配置数据库连接

注意:每个人的数据库连接连接信息不一样,对应修改自己的信息。

state2/models/dbConnect.js中配置数据库连接信息:

// 该文件负责连接数据库
const { Sequelize } = require("sequelize");

// 创建数据库连接
const sequelize = new Sequelize("mysite2", "root", "123456aa", {
    host: "localhost",
    dialect: 'mysql',
    logging: false
});

const startDB=async()=> {
    try {
        await sequelize.authenticate();
        console.log('数据库已建立起连接.');
    } catch (error) {
        console.error('Unable to connect to the database:', error);
    }
}
startDB()

// 向外暴露这个连接实例
module.exports = sequelize;

3、定义数据模型

在state2/models/userModel写入以下代码:

const { DataTypes } = require("sequelize");
const sequelize = require("./dbConnect");

// 定义数据模型
module.exports = sequelize.define("koauser", {
    // 这张表拥有哪些字段
    name : {
        type : DataTypes.STRING,
        allowNull : true
    },
    age : {
        type : DataTypes.INTEGER,
        allowNull : true
    },
},{
    //与模型定义时的名称一致。 
    // 比如定义了上述定义了content模型,设置了这个字段,创建表的名字也是content。
    freezeTableName : true,  
    //用于记录数据的创建时间和更新时间。
    createdAt : false,  
    updatedAt : false
});

这里我们定义了一个名为“koauser”的数据表,有name和age字段,分别是string和integer数据类型。 

4、初始化Sequelize和加载模型

在state2/demodels/db.js写入以下代码:

// 该文件负责对数据库进行一个初始化操作
const sequelize = require("./dbConnect"); // 数据库连接实例

const userModel = require("./userModel"); // 数据模型
const initData=async function () {
    // 将数据模型和表进行同步
    await sequelize.sync({
        alter: true,
    })

    // 同步完成之后,有一些表是需要一些初始化数据
    // 查询这张表有没有内容,没有内容才初始化数据
    const userCount = await userModel.count();
    if (!userCount) {
        // 进入此 if,说明该表没有数据,我们进行一个初始化
        await userModel.create({
            name: "Tom",
            age:18
        })
        console.log("初始化内容数据表数据完毕...");
    }

    console.log("数据库数据已经准备完毕....");
}
initData()

5、创建Koa应用并集成Sequelize

在state2/demo5.js中写入以下代码:

const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');
// const models = require('./models');
const userModel = require('./models/userModel');
const app = new Koa();
const router = new Router();


require('./models/db');
// 使用bodyParser中间件解析请求体
app.use(bodyParser());

// 定义路由
router.get('/', async (ctx) => {
  ctx.body = 'Welcome to Koa with Sequelize!';
});


// 使用路由中间件
app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
  console.log('Server is running at http://localhost:3000');
});

启动服务,看是否正常连接数据库和创建、初始化数据表。 

在state2的目录下打开终端,执行node demo5.js

启动之前,数据库的表情况 

启动之后,多了一个koauser的数据表,并且有一条数据。

6、增删改查(CRUD)操作

Create:增加

Read:查

Update:更新

Delete:删除

6.1、查找所有用户信息

在state2/demo5.js中新增代码:

// 查找所有用户
router.get('/users', async (ctx) => {
  const users = await userModel.findAll();
  ctx.body = users;
});

方法放在这个位置

测试:启动服务+apipost工具

新增get方法,点击发送则会得到以下结果

6.2、 增加新的用户

//   创建用户
router.post('/user', async (ctx) => {
  const { name, age } = ctx.request.body;
  try {
    const user = await userModel.create({ name,age });
    ctx.body = user;
  } catch (error) {
    ctx.status = 400;
    ctx.body = { error: error.message };
  }
});

测试:启动服务+添加post方法

 在数据表中刷新可以看到新增的数据项

6.3、查找单条用户数据

为了后续测试,先增加了几条数据

 

// 查找单个用户
router.get('/user/:id', async (ctx) => {
  const { id } = ctx.params;
  try {
    const user = await userModel.findByPk(id);
    if (user) {
      ctx.body = user;
    } else {
      ctx.status = 404;
      ctx.body = { error: 'User not found' };
    }
  } catch (error) {
    ctx.status = 400;
    ctx.body = { error: error.message };
  }
});

测试:启动服务+添加get方法

查找id为1的数据项

查找id为3的数据项

 6.4、更新用户信息

  // 更新用户
  router.put('/user/:id', async (ctx) => {
    const { id } = ctx.params;
    const { name,age } = ctx.request.body;
    try {
      const user = await userModel.findByPk(id);
      if (user) {
        await user.update({ name,age });
        ctx.body = user;
      } else {
        ctx.status = 404;
        ctx.body = { error: 'User not found' };
      }
    } catch (error) {
      ctx.status = 400;
      ctx.body = { error: error.message };
    }
  });

 测试:启动服务+测试put方法

我们尝试将id为1的数据项,对name进行修改成"Rura"(原本是Tom)

响应结果

 刷新数据表,可以看见id为1的数据项的name已经被修改。

6.5、删除用户信息

  // 删除用户
  router.delete('/user/:id', async (ctx) => {
    const { id } = ctx.params;
    try {
      const user = await userModel.findByPk(id);
      if (user) {
        await user.destroy();
        ctx.status = 204;
      } else {
        ctx.status = 404;
        ctx.body = { error: 'User not found' };
      }
    } catch (error) {
      ctx.status = 500;
      ctx.body = { error: error.message };
    }
  });

测试:启动服务+测试delete方法

这里我们尝试将id为4的数据项进行删除

点击发送,在数据表中刷新查看结果。

三、小结

这篇我们介绍了在koa中如何使用数据库,创建和初始化数据表,并介绍了数据表的常用操作:增删改查,文章以“代码示范+测试”的内容呈现。文章中用到的代码示范,我已经同步更新在代码仓库中,有需要的朋友请自行获取:koa练习: koa练习

欢迎大家star和fork,也欢迎一起完善这个代码仓~

koa专栏的第二阶段的内容到此结束,后续的文章我会更新第三阶段的内容。

关注我,及时获取最新文章消息~

相关文章:

  • gcc和g++的区别以及明明函数有定义为何链接找不到
  • 7-1 打印沙漏
  • 【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题
  • Python在网络安全中的应用 python与网络安全
  • python环境的yolov11.rknn物体检测
  • 前端VUE+后端uwsgi 环境搭建
  • 算法-栈-删除字符串中的所有相邻重复项
  • 部署k8s 集群1.26.0(containerd方式)
  • SQL优化可以从哪些方面入手
  • 网络基础(持续更新中)
  • 什么是HTTP和HTTPS?它们之间有什么区别?
  • Leetcode 72. 编辑距离
  • UE5 Niagara 粒子远处闪烁解决
  • 告别冷冰冰:如何训练AI写出温暖人心的广告文案
  • 函数重载讲解
  • ios苹果手机使用AScript应用程序实现UI自动化操作,非常简单的一种方式
  • 25化学化工研究生复试面试问题汇总 化学化工专业知识问题很全! 化学化工复试全流程攻略 化学化工考研复试真题汇总
  • 深入理解Python字典(Dictionary):从基础操作到高级应用
  • B. 中位数
  • 安装海康威视相机SDK后,catkin_make其他项目时,出现“libusb_set_option”错误的解决方法
  • 英国和美国就关税贸易协议条款达成一致
  • 家庭相册㉙在沪打拼25年,我理解了父母清晨去卖蜜饯的辛苦
  • 不主动上门检查,上海已制定14个细分领域“企业白名单”甄别规则
  • 当年的你,现在在哪里?——新民晚报杯40周年寻人启事
  • 新加坡总理黄循财领导人民行动党胜选,外交部回应
  • 多省份晒出“五一”旅游“成绩单”:北京游客接待量、旅游消费创历史新高