🎇🎇🎇新年快乐🎇🎇🎇
2020 鼠你最帅,
鼠你最强,
鼠你最棒,
鼠你最红,
鼠你最美,
鼠年吉祥
问与答
❓:你能学到什么?
🙋:sequelize-cli的使用以及sequelize的基础操作。
❓:为什么要使用sequelize-cli?
🙋:就像你使用Git/SVN来管理源代码的更改一样,你可以使用迁移来跟踪数据库的更改。
❓:为什么不将数据模型设计好再演示?
🙋:本文讲的是使用sequelize-cli和sequelize开发的过程。
❓:怎么会有这么多的代码?
🙋:每一步的代码我都贴了出来,只要按照流程做就能快速的完成一个示例。眼见为实,我相信这样学习的效果更好。
❓:怎么没有事务、作用域、数据类型等知识点?
🙋:这篇是入门教程,不过学会了这篇,事务、作用域理解起来更容易。
❓:为什么没有源代码?
🙋:做一遍一定比看一遍的效果好。
准备工作
1、初始化项目
1 | 复制代码 cd 工程目录 |
2、安装模块
1 | 复制代码 npm i koa koa-body koa-router mysql2 sequelize sequelize-cli -S |
3、添加server.js文件
1 | 复制代码 const Koa = require('koa'); |
快速入门
1、新建.sequelizerc文件
1 | 复制代码 const path = require('path'); |
2、初始化
1 | 复制代码 npx sequelize-cli init |
3、编辑./db/config.js
1 | 复制代码 "development": { |
4、创建数据库
1 | 复制代码 npx sequelize-cli db:create |
5、生成student模型文件以及迁移文件
1 | 复制代码 npx sequelize-cli model:generate --name student --attributes student_name:string,student_age:integer,student_sex:boolean |
6、编辑./db/migrations/xxxxx-create-student.js
1 | 复制代码 'use strict'; |
打开xxxxx-create-student.你会发现createTable方法的第一个参数为students,这是由于sequelize会默认将表名称转换为复数形式,这里我将其修改为student,后面所有表名或模型名称都会使用单数形式。
7、生成名称为student的数据表
1 | 复制代码 npx sequelize-cli db:migrate |
8、生成student表种子文件
1 | 复制代码 npx sequelize-cli seed:generate --name init-student |
9、编辑./db/seeders/xxxxx-init-student.js文件
1 | 复制代码'use strict'; |
10、student表初始化数据
1 | 复制代码 npx sequelize-cli db:seed:all |
11、编辑.db/models/student.js
1 | 复制代码'use strict'; |
12、编辑server.js文件
1 | 复制代码..... |
13、启动服务并使用Postman测试
1 | 复制代码 node server.js |
模型关连
hasMany(一对多)
一个班级里面可以有多个学生,班级与学生的关系就是一对多。为了完成这个例子我们会做以下几件事情:
- 创建名称为_class的班级表
- _class班级表初始化数据
- student表添加列名为class_id的列
- 重新初始化student表数据
- 查询某个班级所有学生
让我们开始吧!
1、生成**_class**模型以及迁移文件
1 | 复制代码npx sequelize-cli model:generate --name _class --attributes class_name:string |
2、修改./db/migrations/xxxxx-create-class.js
1 | 复制代码 'use strict'; |
3、生成**_class**表
1 | 复制代码npx sequelize-cli db:migrate |
4、生成**_class**表种子文件
1 | 复制代码 npx sequelize-cli seed:generate --name init-class |
5、编辑./db/seeders/xxxxx-init-class.js
1 | 复制代码'use strict'; |
6、_class表初始化数据
1 | 复制代码 npx sequelize-cli db:seed --seed xxxxx-init-class.js |
7、生成修改studnet表的迁移文件
1 | 复制代码npx sequelize-cli migration:generate --name add-column-class_id-to-student.js |
8、编辑./db/migrations/xxxxx-add-column-class_id-to-student.js
1 | 复制代码'use strict'; |
9、修改student表
1 | 复制代码npx sequelize-cli db:migrate |
10、重新生成student表种子文件
1 | 复制代码npx sequelize-cli seed:generate --name init-student-after-add-column-class_id |
11、编辑./db/seeders/xxxxx-init-student-after-add-column-class_id.js文件
1 | 复制代码'use strict'; |
12、撤销student表中已有的数据
1 | 复制代码npx sequelize-cli db:seed:undo --seed xxxxx-init-student.js |
13、stuent表重新初始化数据
1 | 复制代码npx sequelize-cli db:seed --seed xxxxx-init-student-after-add-column-class_id.js |
14、编辑./db/models/_class.js文件
1 | 复制代码'use strict'; |
15、编辑server.js
1 | 复制代码... |
belongsTo(一对一)
一个学生只能属于一个班级,所以学生和班级的关系是一对一。
1、修改./db/models/student.js文件
1 | 复制代码 ... |
2、修改server.js中获取学生列表的接口
1 | 复制代码... |
belongsTo VS hasOne
student.belongsTo(models._class)这里student叫做源模型,_class叫做目标模型。
student表中包含了_class表的外键class_id,也就是说外键在源模型上面所以我们使用belongsTo来创建关联。
hasOne和belongsTo都是用来创建一对一关联的,正确使用它们的方法就是看外键在哪个模型中。
- belongsTo关联外键在源模型上
- hasOne关联外键在目标模型上
belongsToMany(多对多)
一个班级可以有多名代课老师,一名代课老师可以带多个班级的课程。班级与老师的关系是多对多
为了完成此功能的演示,我们将做以下工作:
- 创建名称
让我们开始吧!
1、生成teacher模型以及迁移文件
1 | 复制代码npx sequelize-cli model:generate --name teacher --attributes teacher_name:string |
2、修改./db/migrations/xxxxx-teacher-class.js
1 | 复制代码'use strict'; |
3、生成teacher表
1 | 复制代码npx sequelize-cli db:migrate |
4、生成teacher表种子文件
1 | 复制代码 npx sequelize-cli seed:generate --name init-teacher |
5、编辑./db/seeders/xxxxx-init-teacher.js
1 | 复制代码'use strict'; |
6、teacher表初始化数据
1 | 复制代码 npx sequelize-cli db:seed --seed xxxxx-init-teacher.js |
7、生成teacher_class模型以及迁移文件
1 | 复制代码npx sequelize-cli model:generate --name teacher_class --attributes teacher_id:integer,class_id:integer |
8、编辑./db/migrations/xxxxx-create-teacher-class.js
1 | 复制代码'use strict'; |
9、生成teacher_class表
1 | 复制代码npx sequelize-cli db:migrate |
10、生成teacher_class表种子文件
1 | 复制代码 npx sequelize-cli seed:generate --name init-teacher_class |
11、编辑./db/seeders/xxxxx-init-teacher_class.js
1 | 复制代码'use strict'; |
12、teacher_class表初始化数据
1 | 复制代码 npx sequelize-cli db:seed --seed xxxxx-init-teacher_class.js |
13、编辑./db/models/teacher.js
1 | 复制代码'use strict'; |
14、编辑./db/models/_class.js
1 | 复制代码'use strict'; |
15、编辑server.js
1 | 复制代码const Teacher = require('./db/models').teacher; |
查询
基础查询
1、返回指定列
1 | 复制代码 Student.findAll({ |
2、单条件查询
1 | 复制代码 Student.findAll({ |
3、AND
1 | 复制代码 //返回id为1,姓名是`孙悟空`的学生信息 |
4、OR
1 | 复制代码 //返回年龄等于12或者22的学生信息 |
5、条件查询- >,>=,<,<=,=
1 | 复制代码 // 返回年龄大于等于20的学生 |
1 | 复制代码 [Op.gt]: 6 //大于6 |
6、IN
1 | 复制代码 // 返回年龄是16和18的学生信息 |
7、LIKE
1 | 复制代码 // 返回名称包含'孙'的学生信息 |
聚合函数
1、获取学生的平均年龄
1 | 复制代码 Student.findAll({ |
2、获取学生总数
1 | 复制代码 Student.findAll({ |
嵌套查询
1、获取一班所有的学生并根据年龄降序排列
1 | 复制代码 Class.findAll({ |
参考
本文转载自: 掘金