koa2 mysql增删改查_Vue2+Koa2+Typescript先后端框架教程--05Sequelize(ORM)的使用,实现基础的班级增删改查API...

本教程介绍了如何利用Sequelize ORM在Node.js的Koa2框架中实现与MySQL数据库的连接,创建班级管理的增删改查API。包括数据库配置、模型定义、服务层和控制器的编写,以及测试操作。
摘要由CSDN通过智能技术生成

本篇开始分享Node.js后端服务开发中对于数据结构ORM的实现,主要使用的技术栈是:Sequelize。html

上一篇文章中讲到班级管理的数据结构:ID,班级名称,班级编码,班主任ID,使用的数据库是MySQL,经过Sequelize,实现简单的增删改查的API。node

1. MySQL中建立数据库和班级表。mysql

1.1 建立数据库demo_nodesql

CREATE DATABASE `demo_node` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci*/ /*!80016 DEFAULT ENCRYPTION='N'*/;

1.2 建立班级表t_classtypescript

CREATE TABLE `demo_node`.`t_class` (

`id` VARCHAR(36) NOT NULL,

`class_name` VARCHAR(45) NULL,

`class_code` VARCHAR(20) NULL,

`head_teacher_id` VARCHAR(45) NULL,

PRIMARY KEY (`id`))

COMMENT= '班级表';

2. 安装Sequelize。数据库

npm install sequelize -s

npm install mysql2 -s

注:Sequelize链接哪一种数据库就要安装对应数据库的驱动npm

3. src根目录下添加数据库配置文件:db_config.tsjson

import { Sequelize } from 'sequelize';const DbSequelize = newSequelize({

host:"localhost",//本地:localhost,其余服务器使用ip地址

dialect: "mysql",//链接数据库类型

database: "demo_node",//数据库名称

username: "root",//数据库帐户用户名

password: "123456",//数据库帐户密码

define: {

timestamps:false,//是否开启时间戳createAt deleteAt updateAt

underscored: true,//下划线

freezeTableName: true, //禁止sequelize修改表名,默认会在表后边添加一个字母`s`表示复数

paranoid: true //开启假删除

},

pool: {

max:10,

min:0,

acquire:30000,

idle:10000},

timezone:'+08:00',//时区设置,东八区

});

exportdefault DbSequelize;

4. 定义Model:在models文件夹中修改class.ts,定义班级模型。(上一篇使用的是sequelize-typescript,这里没有使用,因此模型定义有所区别,可是思路一致)后端

import { Sequelize, DataTypes } from "sequelize";

import DbSequelizefrom "../db_config";//班级模型

export default DbSequelize.define('ClassModel', {

id: {

type: DataTypes.STRING,

primaryKey:true//设为主键

},

className: {

type: DataTypes.STRING

},

classCode: {

type: DataTypes.STRING

},

headTeacherId: {

type: DataTypes.STRING

},

}, {

tableName:'t_class'//定义对应数据库表名

});

5. 定义Service,在services中修改class.ts:api

import ClassModel from '../models/class';//班级管理服务

export default classClassService {//获取全部班级

asyncfindClassList() {try{returnClassModel.findAll({

attributes: ['id', 'className', 'classCode', 'headTeacherId']

});

}catch(err) {throw(err);

}

}//获取单个班级

async findClassById(classId: string) {try{returnClassModel.findOne({

attributes: ['id', 'className', 'classCode', 'headTeacherId'],where: { id: classId }

});

}catch(err) {throw(err);

}

}//删除班级

async deleteClass(classId: string) {try{return await ClassModel.destroy({ where: { id: classId } });

}catch(err) {throw(err);

}

}//修改班级

asynceditClass(classObj: any) {try{return await ClassModel.update(classObj, { where: { id: classObj.id }, individualHooks: true});

}catch(err) {throw(err);

}

}//添加班级

asyncaddClass(classObj: any) {try{return awaitClassModel.create(classObj);

}catch(err) {throw(err);

}

}

}

6. 定义Controller,在controllers文件夹中修改班级控制器class.ts:

import ClassService from '../services/class';const clsService = newClassService();//班级管理控制器

export default classClassController {//查找全部班级

static asyncfindClassList(ctx: any) {try{//调用查询列表服务,获取结果

let res = awaitclsService.findClassList();

ctx.body={

status:1,//返回码:1操做成功,0操做错误

data: {

classList: res

}

}

}catch(err) {

ctx.throw(err.message);

}

}//根据班级id获取班级详细信息

static asyncfindClassById(ctx: any) {try{

let id=ctx.request.query.id;if (!id) {

ctx.body={

status:0}return;

}//调用查询详情服务,获取结果

let res = awaitclsService.findClassById(id);

ctx.body={

status:1,

data: {class: res

}

}

}catch(err) {

ctx.throw(err.message);

}

}//删除班级

static asyncdeleteClass(ctx: any) {try{

let id:string =ctx.request.body.id;//调用删除服务,获取结果

let res: any = awaitclsService.deleteClass(id);if (res === 1) {

ctx.body={

status:1}

}else{

ctx.body={

status:0}

}

}catch(err) {

ctx.throw(err.message);

}

}//修改班级

static asynceditClass(ctx: any) {try{

let obj: any=ctx.request.body;//调用修改服务,获取结果

let res: any = awaitclsService.editClass(obj);if (res[0] !== 1) {

ctx.body={

status:0}

}else{

ctx.body={

status:1,

data: {

classId: res[1][0].id

}

}

}

}catch(err) {

ctx.throw(err.message);

}

}//添加班级

static asyncaddClass(ctx: any) {try{

let obj: any=ctx.request.body;//调用添加服务,获取结果

let res: any = awaitclsService.addClass(obj);if (!res) {

ctx.body={

status:0}

}else{

ctx.body={

status:1,

data: {

classId: res.id

}

}

}

}catch(err) {

ctx.throw(err.message);

}

}

}

7. router如上篇一致,以下:

import KoaRouter from 'koa-router';

import ClassControllerfrom './controllers/class';const router = newKoaRouter();

router.post('/api/class/addClass', ClassController.addClass);

router.post('/api/class/editClass', ClassController.editClass);

router.post('/api/class/deleteClass', ClassController.deleteClass);

router.get('/api/class/findClassById', ClassController.findClassById);

router.get('/api/class/findClassList', ClassController.findClassList);

exportdefault router;

8.开始测试:

8.1 安装koa-body: 因为添加修改删除定义为post方法,因此首先要安装koa-body,才能获取到post过来的数据(删除也能够使用get)

npm install koa-body -s

8.2 修改app.ts,添加koa-body中间件引用

const Koa = require('koa');

import KoaBodyfrom "koa-body";const app = newKoa();

app.use(KoaBody({

multipart:true,

formidable: {

maxFileSize:1000 * 1024 * 1024 //设置上传文件大小最大限制,默认2M

},

formLimit:"10mb",

jsonLimit:"10mb",

textLimit:"10mb"}));//引入路由

import router from './router';//添加中间件

app.use(router.routes());

app.use(router.allowedMethods());

app.use(async (ctx: any) =>{

ctx.body= 'Hello World...Hello LaoLv';

});

console.log('app server start on port 3000...')

app.listen(3000);

8.3 添加班级,使用postman,操做以下:

3de1a3302b5816597a0ab9fa72c7fff7.png

数据库表展现以下:

38b086516cbdae82bb0f1c284024cd60.png

8.4 更新班级,操做以下:

93764a5059f1f988c57a22a4639cb03e.png

数据库表展现以下:

203890cb2083452470079ae88c38ca0e.png

8.5 查询班级,操做以下:

94d8fa85abdf4ba267c336026d0c57d1.png

8.6 删除班级,操做以下:

7bfba4e88957a6081ebbfc7469b034a6.png

数据库表展现以下:

7e37e48810f43037fb739e987ad9835b.png

9. 如上所示,使用sequelize简单实现三层模式对班级的增删改查。文件结构图如上篇一致:

0b24448d5229af0f99acc106b96d21ad.png

这样,基础的增删改查数据流向基本完成。后面会对sequelize中复杂查询进行详细分享,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值