egg mysql 连表查询_Egg中使用Sequelize框架关联查询Mysql数据库
Sequelize视频教程_Eggjs仿小米商城企业级Nodejs项目实战视频教程: https://www.itying.com/goods-941.html
一、Sequelize简介
前面的章节中,我们介绍了如何在框架中通过 egg-mysql 插件来访问数据库。而在一些较为复杂的应用中,我们可能会需要一个 ORM 框架来帮助我们管理数据层的代码。而在 Node.js 社区中,sequelize 是一个广泛使用的 ORM 框架,它支持 MySQL、SQLite 和 MSSQL 、PostgreSQL等多个数据源。下面我们主要给大家讲讲sequelize 结合MySQL的使用。
相关文档:
二、Sequelize 操作Mysql数据库
1、安装egg-sequelize以及mysql2
npm install --save egg-sequelize mysql2
2、在 config/plugin.js 中引入 egg-sequelize 插件
exports.sequelize = {
enable: true,
package: 'egg-sequelize',
};
3、 在 config/config.default.js 中编写 sequelize 配置
config.sequelize = {
dialect: 'mysql',
host: '127.0.0.1',
port: 3306,
database: 'test',
username:"root",
password:"123456"
};
三、Sequelize 操作Mysql实现增删改查
1、在app/model/ 目录下编写数据库Model,以用户表user为例
'use strict';
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const User = app.model.define('user', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
name: STRING(30),
age: INTEGER,
created_at: DATE,
updated_at: DATE,
});
return User;
};
或者
'use strict';
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const User = app.model.define('user', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
name: STRING(30),
age: INTEGER,
created_at: DATE,
updated_at: DATE,
},{
timestamps: false, //自动增加创建时间
tableName: 'user_info' //设置表名称
});
return User;
};
2、定义controller实现数据库的增删改查
async index() {
const ctx = this.ctx;
ctx.body = await ctx.model.User.findAll({limit: 10, offset: 0,order:[["id","desc"]]});
//指定返回的字段
//ctx.body = await ctx.model.User.findAll({attributes: ['id', 'name'],limit: 10,order:[["id","desc"]]});
}
async findOne() {
const ctx = this.ctx;
var result = await ctx.model.User.findByPk(106);
ctx.body=result || '';
}
async create() {
const ctx = this.ctx;
const user = await ctx.model.User.create({ name:"张三", age:20 });
ctx.status = 201;
ctx.body = user;
}
async update() {
const ctx = this.ctx;
const id = 106;
const user = await ctx.model.User.findByPk(id);
if (!user) {
ctx.status = 404;
return;
}
await user.update({ name:"李四", age:43 });
ctx.body = user;
}
async destroy() {
const ctx = this.ctx;
const id = 213;
const user = await ctx.model.User.findByPk(id);
if (!user) {
ctx.status = 404;
return;
}
await user.destroy();
ctx.status = 200;
ctx.body="删除成功";
}
四、Sequelize 操作多表关联查询
4.1、1对1 hasOne 或者 belongsTo
ArticleCate.associate = function (){
// 1对1
app.model.ArticleCate.hasOne(app.model.Article, {foreignKey: 'cateId'});
}
查询语句
const { ctx } = this;
let result = await ctx.model.ArticleCate.findAll({
include: {
model: ctx.model.Article
}
});Article.associate = function (){
// 1对1
app.model.Article.belongsTo(app.model.ArticleCate, {foreignKey: 'cateId'});
}
查询语句
const { ctx } = this;
let result = await ctx.model.Article.findAll({
include: {
model: ctx.model.ArticleCate
}
});
4.2、1对多 hasMany
ArticleCate.associate = function (){
// 1对多
app.model.ArticleCate.hasMany(app.model.Article, {foreignKey: 'cateId'});
}
查询语句
const { ctx } = this;
let result = await ctx.model.ArticleCate.findAll({
include: {
model: ctx.model.Article
}
});
4.3、多对多 belongsToMany
model/student.js
module.exports = app => {
const { STRING, INTEGER } = app.Sequelize;
const Student = app.model.define('student', {
id: {
type: INTEGER,
autoIncrement: true,
primaryKey: true
},
name: {
type: STRING,
},
number: {
type: STRING,
allowNull: false,
},
password: {
type: STRING(32),
allowNull: false
}
}, {
timestamps: false,
tableName: 'student'
});
Student.associate = function () {
//一个学生可以选修多门课程
app.model.Student.belongsToMany(app.model.Lesson, {
through: app.model.LessonStudent,
foreignKey: 'studentId',//注意写法
otherKey: 'lessonId'
});
}
return Student;
}
model/lesson.js
module.exports = app => {
const { INTEGER, STRING } = app.Sequelize;
const Lesson = app.model.define('lesson', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: STRING,
allowNull: false
}
},{
timestamps: false,
tableName: 'lesson'
});
Lesson.associate = function () {
//一个学生可以选修多门课程
//一门课程可以被多个学生选修
app.model.Lesson.belongsToMany(app.model.Student, {
through: app.model.LessonStudent,
foreignKey: 'lessonId',//注意写法
otherKey: 'studentId'
});
}
return Lesson;
}
model/lesson_student.js
module.exports = app => {
const { INTEGER } = app.Sequelize;
const LessonStudent = app.model.define('lesson_student', {
lessonId: {
type: INTEGER,
primaryKey: true
},
studentId: {
type: INTEGER,
primaryKey: true
}
},{
timestamps: false,
tableName: 'lesson_student'
});
// LessonStudent.associate = function(){
// }
return LessonStudent;
}
多对多查询数据
'use strict';
const Controller = require('egg').Controller;
class ArticleController extends Controller {
//查询数据 1对1 1对多
async index() {
const { ctx } = this;
// let result = await ctx.model.Article.findAll({
// include: {
// model: ctx.model.ArticleCate
// }
// });
let result = await ctx.model.ArticleCate.findAll({
include: {
model: ctx.model.Article
}
});
ctx.body = result;
}
//查询数据 多对多
async showAll() {
const { ctx } = this;
//课程有哪些学生选修
// let result = await ctx.model.Lesson.findAll({
// include: {
// model: ctx.model.Student
// }
// });
//每个学生选修了哪些课程
let result = await ctx.model.Student.findAll({
include: {
model: ctx.model.Lesson
}
});
ctx.body = result;
}
}
module.exports = ArticleController;
egg mysql 连表查询_Egg中使用Sequelize框架关联查询Mysql数据库相关推荐
- php with语法,Yii框架关联查询with用法分析
本文实例分析了Yii框架关联查询with用法.分享给大家供大家参考.具体方法如下: Yii框架关联查询与mysql中的关联查询会有什么区别呢?这里小编就与各位来一起来看看吧. Yii的关联查询确实是一 ...
- mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...
这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...
- mysql查询名字中第2个字为丽,数据库技术课程复习5---MySQL语言(2)(单表查询)
0.学习前言 单表查询理解起来是比较简单的,关键要注意格式化指令的使用方法,一起加油鸭! 1.语句格式 语句格式 SELECT [ALL|DISTINCT] [,] - FROM [, ] - [ W ...
- mysql在查询结果中添加数据_MySQL将查询结果插入到数据表中
转自Mysql教程:http://www.baike369.com/content/?id=5582 MySQL将查询结果插入到数据表中 INSERT语句还可以将SELECT语句查询出来的数据插入到另 ...
- mysql 分表索引_mysql中,分表查询和索引查询哪个更快?
谢谢邀请! 查询快慢主决的因素有很多,存储碎片.数据量大属于I/O类问题:表结构设计.查询语句属于技术是否熟练(经验)问题.对于你的分表快还是索引快的这个问题本身就是有问题的: 在建立数据表的时候,索 ...
- mysql 查看表v空间自增涨_专业解决 MySQL 查询速度慢与性能差!
一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒能够相应的查 ...
- mysql 查看表v空间自增涨_分分钟解决MySQL查询速度慢与性能差
阅读本文大概需要 6 分钟. 一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是"每秒查询率", ...
- mysql 查看表v空间自增涨_分分钟解决 MySQL 查询速度慢与性能差
专注于Java领域优质技术号,欢迎关注 作者:唐立勇 一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是" ...
- mysql sys_config表_mysql5.7中的sys表详解(转)
在说明系统数据库之前,先来看下MySQL在数据字典方面的演变历史: MySQL4.1 提供了information_schema 数据字典.从此可以很简单的用SQL语句来检索需要的系统元数据了. My ...
最新文章
- Linux的shell脚本实战之while循环
- malloc动态分配多维数组
- 数字图像处理的就业前景
- E 做任务三(区间)
- [xsy3132]数表
- APL开发日志--2013-01-17
- Query String Parameters、Form Data、Request Payload的区别
- 如何检查Django版本
- 我的站(艾网---城市生活新门户)重新上线了
- Jmeter---Jmeter安装教程
- tmb100a linux,天猫魔盒TMB100E短接降级官方1.7版本
- Hybird接口的理解
- 韩顺平 教学资料下载
- 单位电脑禁用u盘_组策略禁止u盘_注册表禁止u盘
- 异或运算——小卡和质数
- 中新社、新华报业网等媒体报道腾云忆想云化IT生态,聚焦科技助力“双循环经济”数字化升级
- CVE-2014-1767
- CSS三列布局(五种方式)
- Android播放音频工具类
- Onvif/RTSP摄像头直播中云台控制