说人话就是把数据扔到数据库中
对象关系映射ORM
安装sequelize
- 安装两个插件
cnpm install egg-sequelize mysql2
- 引入插件
plugin.js
sequelize: {
enable: true,
package: 'egg-sequelize'
},
- 配置插件
config.default.js
config.sequelize = {
dialect:'mysql',//使用mysql数据库系统
database:'test',//使用test这个数据库
host:'localhost',
port:3306,
username:'root',//用root用户的登录数据库系统
password:'123456'
};
- 创建数据模型(定义表的结构)
sequelize的数据类型
表都写在app的model目录下
创建班级班,由于class是js的关键字,所以表名改成clazz
先定义clazz表
clazz.js
module.exports = app => {
const {STRING} = app.Sequelize;//表中定义的数据类型
const Clazz = app.model.define('clazz',{//通过app.model.define方法创建数据表
//会自动生成id字段
name:STRING,
},
{
freezeTableName: true,//如果不设置此项,在数据库中表名会多个s,如clazzs
createdAt: false,//不默认加创建时间字段
updatedAt: false,//不默认加修改时间字段
}
)
return Clazz;
}
- 在根目录创建app.js,与app同级
用来创建表
app.js
module.exports = app => {
app.beforeStart(async function(){//在项目启动的时候执行
await app.model.sync({});//app.model拿到数据模型,它的sync方法能根据模型创建表
});
};
启动项目后
在后台操作数据库
用controller来操作数据库(实际开发是在service层操作)
在controller目录下新建clazz.js
配置路由router.js
router.resources("clazz","/clazz",controller.clazz);
clazz.js
const { Controller } = require('egg');
class clazzController extends Controller {
async index() {
let id = this.ctx.request.query.id;//query获取get请求发给后台的参数,而不能是body.id
let clazzList = await this.app.model.Clazz.findAll({
where:{
id:id//where条件查询
}
});//sequelize定义的查询表格所有信息的函数findAll
this.ctx.body = clazzList;
}
async create() {
let name = this.ctx.request.body.name;//前端传来的name
await this.app.model.Clazz.create({//添加数据的函数create
name:name//第一个name是字段
});
this.ctx.body = "添加成功";
}
async destroy() {
let id = this.ctx.params.id;
await this.app.model.Clazz.destroy({where:{
id:id
}});
this.ctx.body = "删除成功";
}
async update() {
let id = this.ctx.params.id;
let name = this.ctx.request.body.name;
await this.app.model.Clazz.update({name:name},{
where:{
id:id
}
});
this.ctx.body = "修改成功";
}
}
module.exports = clazzController;
-
增
-
删
-
改
-
查
async index() {
let clazzList = await this.app.model.Clazz.findAll();
this.ctx.body = clazzList;
}
条件查询
async index() {
let id = this.ctx.request.query.id;//query获取get请求发给后台的参数,而不能是body.id
let clazzList = await this.app.model.Clazz.findAll({
where:{
id:id//where条件查询
}
});//sequelize定义的查询表格所有信息的函数findAll
this.ctx.body = clazzList;
}
添加外键
将student表和clazz表关联
新建数据模型student.js
module.exports = app => {
const {STRING,DOUBLE} = app.Sequelize;//表中定义的数据类型
const Student = app.model.define('student',{//通过app.model.define方法创建数据表
//会自动生成id字段
name:STRING,
score:DOUBLE,
},
{
freezeTableName: true,//如果不设置此项,在数据库中表名会多个s,如clazzs
createdAt: false,//不默认加创建时间字段
updatedAt: false,//不默认加修改时间字段
}
);
Student.associate = function(){
app.model.Student.belongsTo(app.model.Clazz,{//与Clazz关联
foreignKey:'clazz_id',//student表的外键,字段名为clazz_id
as:'clazz'
})
}
return Student;
}
controller中新建student.js
以增查的方法为例
const { Controller } = require('egg');
class studentController extends Controller {
async index() {
let id = this.ctx.request.query.id;
let studentList = await this.app.model.Student.findAll({
where:{
id:id//where条件查询
}
});//sequelize定义的查询表格所有信息的函数findAll
this.ctx.body = studentList;
}
async create() {
let name = this.ctx.request.body.name;
let score = this.ctx.request.body.score;
await this.app.model.Student.create({
name:name,
score:score
});
this.ctx.body = "添加成功";
}
}
module.exports = studentController;
app.js改下启动配置
module.exports = app => {
app.beforeStart(async function(){//在项目启动的时候执行
// await app.model.sync({});//app.model拿到数据模型,它的sync方法能根据模型创建表
await app.model.sync({force:true});//开发时使用,再次启动项目时会清空表格中的数据
});
};
添加
查看