koa --- 使用Sequelize连接mysql

Sequelize介绍

  • 为了快捷开发,社区出现了一系列的ORM(Object Relational Mapping)类库
  • ORM的字面意思为对象关系映射,它提供了概念性的、易于理解的模型化数据的方法。通过ORM,可以降低操作数据库的成本。开发者不需要通过编写SQL脚本来操作数据库,直接通过访问对象的方式来查询、更新数据。这样做极大地提升了开发效率,降低了开发门槛。缺点也很明显,不够高效
  • 在Node.js中,一般采用Sequelize这个ORM类库来操作数据库.
const Sequelize = require('sequelize');
const sequelize = new Sequelize('databaseName', 'userName', 'password', {host:'localhost',  // 数据库服务地址dialect: 'mysql'   // SQL语言类型
});
sequelize.authenticate().then(()=>{console.log('Connected');
}).catch(err=>{console.error('Connect failed');
})
  • 使用docker创建一个数据库.
    使用docker-compose.yml写配置文件如下:
version: '3.1'
services:mysql:image: mysqlcommand: --default-authentication-plugin=mysql_native_passwordrestart: alwaysenvironment:MTSQL_ROOT_PASSWORD: exampleports:- 3306:3306adminer:image: adminerrestart: alwaysports:- 8080:8080

使用如下命令生成docker

docker-compose up

连接数据库

const Sequelize = require('sequelize');
const sequelize = new Sequelize('数据库名称','用户名(默认:root)','密码(docker-compose.yml中设置的)', {host:'localhost',dialect: 'mysql'
});
sequelize.authenticate().then(()=>{console.log('Connected');
})
.catch(err=>{console.error('Connect failed', err);
})

定义模型

  • 常用
const Category = sequelize.define('category', {id: Sequelize.UUID,   // 定义id字段,类型为UUIDname: Sequelize.STRING    // 定义name字段,类型为String
})
  • 给模型加约束条件
const Project = sequelize.define('project', {name: {type: Sequelize.STRING,   // 定位类型为StringallowNull: false,   //不能为空unique: true   // 必须唯一,不允许重复},date: {type: Sequelize.DATE,defaultValue: Sequelize.NOW     // 设置为当前时间}
})
  • 给字段定义Getter和Setter方法:
const Custom = sequelize.define('custom', {name: {type: Sequelize.STRING,get(){const title = this.getDataValue('title');return `${this.getDataValue('name')} (${titile}) `}},title: {title: Sequelize.STRING,set (val) {this.setDataValue('title', val.toUpperCase())}}
})

查询数据

  • 查询所有
    await Product.findAll()

  • 查询name和data字段
    await Project.findAll({ attributes: ['name', 'date'] })

在使用一个库的时候,可以先把库的方法包装以下,变成自己的库

  • 在下面的栗子中,首先把Sequelize库中的API抽离出来,根据实际的业务变成自己项目的函数.通过按需的方式引入到业务中.
  • 这样做利于维护,(例如,Sequelize库变化了,不需要整个项目寻找使用到该接口的函数,或者具体改变了,重新改变接口)

栗子

  • 项目结构如下:
    在这里插入图片描述
  • 设计Customer表的类型,如下:
  • /mysql/model/custom.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize('custom', 'root', 'example', {dialect:'mysql'
});
// 定义Customer模型
const Customer = sequelize.define('customer',{id:{type: Sequelize.UUID,unique: true,primaryKey: true,allowNull: false},name: {type: Sequelize.STRING,allowNull: false},sex: {type: Sequelize.ENUM(['男','女']),allowNull: false},address:{type: Sequelize.STRING},email: {type: Sequelize.STRING,allowNull: false},phone: {type: Sequelize.STRING},country:{type: Sequelize.STRING},city: {type:Sequelize.STRING}
});
  • /mysql/db.js中,对表的功能进行加工
const { Customer } = require('./model/custom');const { Op } = require('sequelize');
async function getAllCustomers() {return Customer.findAndCountAll({attributes: ['id', 'name', 'sex', 'fulladdress'],order: [['updatedAt', 'DESC']]})
}
async function getCustomerById(id) {return Customer.findById(id);
}async function getCustomerByName(name) {return Customer.findAll({where: {name: {[Op.like]: `${name}`}}})
}async function updateCustomer(id, customer) {const item = await getCustomerById(id)if (item) {return item.update(customer);} else {throw new Error('the customer with id ${id} is not exist');}
}async function createCustomer(customer) {return Customer.create(customer);
}async function deleteCustomer(id) {const customer = await getCustomerById(id);if (customer) {return customer.destroy();}
}
  • /mysql/app.js中对对应的路由设置数据库的操作方法(路由层还未抽离出来)
const {getAllCustomers,getCustomerById,getCustomerByName,createCustomer,updateCustomer,deleteCustomer
} = require('./db');
const koa = require('koa');
const app = new koa();
const router = new require('koa-router')();
const bodyParser = require('koa-bodyparser');app.use(async (ctx, next) => {try {await next();} catch (ex) {// ctx.type = jsonMIME;ctx.body = {status: -1,message: ex.message}}
})router.get('/customer', async ctx => {const customers = await getAllCustomers();// ctx.type = jsonMIME;ctx.body = {status: 0,data: customers};
});router.get('/customer/:id', async ctx => {const customer = await getCUstomerById(ctx.params.id);// ctx.type = jsonMIME;ctx.body = {status: 0,data: customer};
});router.get('/customer/name/:name', async ctx => {const customer = await getCUstomerByName(ctx.params.name);// ctx.type = jsonMIME;ctx.body = {status: 0,data: customer};
});router.post('/customer', async ctx => {const customer = ctx.body;await createCustomer(customer);// ctx.type = jsonMIME;ctx.body = {status: 0};
});router.put('/customer/:id', async ctx => {const id = ctx.params.id;const customer = ctx.body;await updateCustomer(id, customer);// ctx.type = jsonMIME;ctx.body = {status: 0};
});router.delete('/customer/:id', async ctx => {await deleteCustomer(ctx.params.id);// ctx.type = jsonMIME;ctx.body = {stauts: 0};
});app.use(bodyParser());
app.use(router.routes());app.listen(3000, async () => {console.log('Server is running at http://localhost:3000');
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android gravity和layout_gravity的区别

一、gravity和layout_gravity相同处 两者都是设置对齐方式的属性。内部的属性值相同。 根据英文意思也能理解其中的意思。如center_horizontal表示在水平方向上的位置为中间。 二、gravity和layout_gravity的不同处 gravity是设置自身内部元素的对齐方式。比如一个TextView&…

koa --- mongoose连接mongoDB

使用Mongoose对MongoDB进行操作 const mongoose require(mongoose); mongoose.connect(mongodb://localhost/test,{ })Mongoose中的Schema 定义Schema categorySchema const categorySchema new mongoose.Schema({name:String,description: String,createdAt:{type: Date,…

Java Web 请求转发与请求重定向

Java Web 请求转发与请求重定向 请求转发 服务器行为,即用户向服务器发送了一次http请求,该请求可能会经过多个信息资源处理以后菜返回给用户,各个信息资源使用请求转发机制互相转发请求,但是用户是感觉不到请求转发的。通过req…

05.RDD详解

05.Spark--RDD详解 RDD详解--groupByKey--reduceByKey [MapPartitionRDD单词统计] 单词统计 import org.apache.spark.{SparkConf,SparkContext} object WordCountScala{def main(args:Array[String]):Unit{//创建spark配置对象val confnew SparkConf()conf.setAppName("W…

Mininet

首先,我折腾了两周多的东西终于弄出一点眉目了。 有以下几个内容需要学习记忆一下。 1.虚拟机,弄不出来共享文件夹,就用U盘吧,贼快还不用安装配置各种东西,virtualbox和VMware都支持。 2.ubantu安装软件中途失败&#…

docker --- 使用docker-compose.yml生成redis,并连接redis-cli

docker.compose.yml 配置 version: 3.1 services:redis:image: redisports:- 6379:6379命令行:docker-compose up 查看: docker ps 进入redis-cli,输入以下 docker exec -it 7dc0a redis-cli -h localhost -p 6379 操作Redis数据 设置 namemarron set name marron 获取nam…

浅谈javaweb三大框架和MVC设计模式

浅谈javaweb三大框架和MVC设计模式转载自:http://blog.csdn.net/sunpeng19960715/article/details/50890705 小序:博主以前在学javaweb的时候开始总不理解javaweb三大框架和MVC框架模式,虽然没有把两者混为一谈,但是也是很晕菜。…

win下配置nginx

1.下载:http://nginx.org/en/download.html 2.在安装目录cmd: start nginx.exe 启动nginx 3.修改默认运行端口80(nginx.conf): HTTP 数据分发 修改配置文件nginx.conf相应节点: 修改完后重启服务: nginx -s reload TCP 数据分发: nginx 1.9以上版本支持tcp转发 配置文件中增加:…

koa --- koa-bouncer验证

使用 koa-bouncer中间件对传入的数据进行验证 const bouncer require(koa-bouncer); app.use(bouncer.middleware());const val async (ctx, next) > {ctx.validateBody(name).required(要求提供用户名).isLength(6, 16, 用户名长度应该为6~16).isString().trim()next();…

fiddler2抓包数据工具使用教程

一款免费且功能强大的数据包抓取软件。它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视、设置断点、甚至修改输入输出数据等功能。fiddler包含了一个强大的基于…

egg --- 初始化一个egg项目基本结构说明

Egg.js体验 全局安装 // 创建项目 $ npm i egg-init -g $ egg-init egg-example --typesimple $ cd egg-example $ npm i// 启动项目 $ npm run dev $ open localhost:7000Egg.js的结构 路由(Router): 将请求URL和具体承担执行动作的Controller的关系对应控制器(Controller)…

葫芦娃

葫芦娃救爷爷 1.队名——代码那些事儿 2.团队成员 刘佳 211606320(队长)李佳 211660313周世元 211606348王浩 211606378曾丽丽 211606302陈水莲 211606303许燕婷 211606338杨小妮 2116063413.队长博客链接 -https://www.cnblogs.com/LJ-D/p/9799944.html…

webstorm遇到的问题

问题一:英译:未指定node.js的解释器。 解决方法:将webstorm配置支持node.js并自动补全 步骤: 先下载node.jsFile->Setting->输入Node.js(选中点进去)->Node imterpreter(选择node的安装…

eclipse报错: Could not generate secret

在调用微信接口时,出现一个错误: 一直以为是接口调用问题,经多方查询和尝试解决,最后找到根源: edit-->使用default就可以了。 原因: 在eclipse中运行时,把签名信息给去掉了。 转载于:https:…

koa --- [MVC实现之一]自定义路由读取规则

实现MVC分层架构 目标是创建约定大于配置、开发效率高、可维护性强的项目架构路由处理 规范 所有路由,都要放在routes文件夹中若导出路由对象,使用 动词空格路径 作为key, 值是操作方法若导出函数, 则函数返回第二条约定格式的对象 路由定义: 新建 router/index.js, 默认index…

bzoj1128 Lam-lights

题目描述 对于一个长度为n的数列p,数列中任意两个数互质。准备一个无限长的储存器。然后从p1开始,把储存器中p1倍数位置都赋值为p1,把储存器中p2倍数位置都赋值为p2,把储存器中p3倍数位置都赋值为p3。。。把储存器中pn倍数位置都赋…

koa --- [MVC实现之二]Controller层的实现

[MVC实现之一]传送门 https://blog.csdn.net/piano9425/article/details/103362966 Router层 router这一层,不做业务处理,仅仅只是将路由和路由的处理函数结合起来.路由的处理函数由Controller层实现改进目录结构如下(实际上新建了controller文件夹及其内部子文件,mar.js) …

Layui --- [Mar]给渲染后的表格加CSS样式

为什么要控制样式 使用layui生成后的表格的样式有时候,并不能满足我们的需求.因此在渲染完成后,需要自定义类对其操作 Layui表格渲染后一般会出现以下结构 分结构如下 我把使用layui的table渲染后的表格分为如下的几个dom 1.$rawTable: 初始table,即 2.$renderTable: 渲染之…

Python 框架之Flask初步了解

Python 框架之Flask初步了解 前言 ​ 在了解python web 框架之前,我们需要先了解框架实现的基本原理。首先,需要了解WSGI(Web Server Gateway Interface),借助WSGI我们就能实现用Python专注于生成HTML文档&#xff0…

koa --- [MVC实现之三]换个角度重新开始-初始化

说明 下面文章是对该系列前面2篇及项目中经验的总结,重新开始写的实现了Mar类,贯穿Router层、Controller层、Service层基本骨架的搭建 初始 使用Koa创建一个简单的服务器,一般会使用如下 const koa require(koa); const app new koa(); const Router require(koa-router…