一 前言
上一篇文章已经做了很多准备工作,这一篇一起讨论如何进行增删改查操作,如果有疑问或者看不懂的,可以先去学习前一节的内容。传送门
二 查询数据
1.先来新建一个路由文件system_manager.js,我们在routes文件夹下创建这个路由文件,然后在app.js文件中使用它。
引入models对象,然后将路由的控制器名称修改为system_manager,再添加一个名为json的GetAPI。
最后,在app.js中使用这个路由文件
const system_manager = require('./routes/system_manager')
app.use(system_manager.routes(), system_manager.allowedMethods())
接下来,修改路由文件中的Json方法
const router = require('koa-router')()
var models = require('../models') //引入模型文件
router.prefix('/system_manager')
router.get('/json', async (ctx, next) => {
let data = await models.system_manager.findAll()
ctx.body = {
data,
state: 200,
flag: true
}
})
module.exports = router
models.system_manager 选择模型文件中的system_manager 模型,注意这里使用的是模型名称,而非数据库表名。
最后使用 findAll() 函数获取模型中的全部数据。
另外请注意 async / await 的使用
models.system_manager.findAll()返回的是一个Promise对象,我们直接使用await接收返回来的数据,注意接口返回的上下文使用了async,否则的话程序会报错。毕竟,await is only valid in async function。语法规定,不多解释。
然后来运行Node项目,调用我们定义的接口,http://localhost:3000/system_manager/json,就可以看到我们存储在数据库中的内容啦。
如果想要进行更多详细的筛选操作,请参考官方网站
如果想进行排序
let data = await models.system_manager.findAll({
order:[['id','DESC']] //按照id进行倒叙排序
})
再附上一个根据主键去查询指定数据的例子
router.get('/get/:id', async (ctx, next) => {
const id = ctx.params.id
let obj = await models.system_manager.findByPk(id) //findByPk方法是根据主键查询数据
if (obj != null) {
ctx.body = obj
} else {
ctx.body = "未找到指定数据"
}
})
三 新增数据
1.先来添加一个POST请求的接口
router.post('/add', async (ctx, next) => {
let b = ctx.request.body
//构建新对象并且插入
let system_manager_obj = await models.system_manager.create({
account: b.account,
password: b.password,
name: b.name,
phone: b.phone,
age: b.age,
role: b.role,
createdAt: moment().format('YYYY-MM-DD HH:mm:ss'),
updatedAt: new Date()
})
console.log(system_manager_obj.id);
ctx.body = "新增完成"
})
然后在我们的BB-API工具中模拟调用
一般默认情况下,Post请求的参数是存储在body中的,执行完成之后,刷新我们的网站界面,可以看到多了一条数据。
更多详细用法,请参考官方网站
四 其他操作
1.修改操作
router.put('/update/:id', async (ctx, next) => {
//修改指定条件的信息的指定值
let obj = await models.system_manager.update({ name: "shaopj" }, {
where: {
id:ctx.params.id
}
})
ctx.body = obj
})
2.删除
/**
* 删除操作
*/
router.delete('/delete/:id', async (ctx, next) => {
//删除指定条件的信息
let obj = await models.system_manager.destroy({
where: {
id: ctx.params.id
}
})
ctx.body = obj
})
Sequelize有很多强大的功能,具体的使用请参考官方文档
五 经验分享
1.运行指定的种子文件
sequelize db:seed --seed 种子文件名
2.运行指定的迁移文件,官方提供了一些办法,但是都不好用,我们在操作过程中,如果修改了迁移文件,再次运行的时候是无法运行成功的,会提示已经运行了迁移文件。
No migrations were executed, database schema was already up to date.
这个时候,我们在数据库中的迁移文件表中删除掉我们修改的迁移文件,再次运行就可以运行啦