# 1. Sequelize
使用wamp
,安装mysql
简单,并且可以用phpmyadmin
可视化数据库
在koa中用sequelize
管理数据库,必须npm install mysql2
,以及npm install sequelize
sequelize
中事务 transaction
须和where
同级
# 1.1. 连接池
- 如果池中有空闲连接可用,返回该连接。
- 如果池中连接都已用完,创建一个新连接添加到池中。
- 如果池中连接已达到最大连接数,请求进入等待队列直到有空闲连接可用。
sequelize连接池,默认最小是0,最大是5。
idle
参数是指闲置的连接超过多少毫秒被释放。acquire
参数是指在建立连接出错的时候,在抛出错误之前,池子会尝试建立连接的最大时间,重新连接成功就不抛出错误,不行才再抛。
# 1.2. 常用 API
// 只选择相应属性
Model.findAll( {
attributes: [ 'foo', 'bar' ]
} );
// 除开某些属性
Model.findAll( {
attributes: { exclude: [ 'baz' ] }
} );
freezeTableName: true, // 默认false修改表名为复数,true不修改表名,与数据库表名同步
Mysql分组查询,如求三种类别图书的点赞数目
Favor.findAll({
where: {
art_id: {
[Op.in]: ids
}
},
group: ['art_id'],
attributes: ['art_id', [Sequelize.fn('COUNT','*'), 'count']]
})
求数目总和是count,求字段总和如分数用sum,第二个参数是字段名称
# 1.3. Sequelize 实现事务
return db.transaction(async t => {
await Favor.create({
art_id,
type,
uid
}, { transaction: t })
const art = await Art.getData(art_id, type)
await art.increment('fav_nums', { by: 1, transaction: t })
})
大写的Favor
是表,小写的favor
是表里的一条记录
# 1.4. allowedMethods
.allowedMethods
处理的业务是当所有路由中间件执行完成之后,若ctx.status
为空或者404的时候,丰富response
对象的header
头。
如果只监听了 / 路由的 POST 方法,在浏览器中使用 GET 方法访问路由,koa 会自动设置一些 Header 并返回访问该路由的方法不被允许
# 1.5. 注意事项
- 用户
id
不能通过参数传递,非常危险,应该通过token
- 避免循环查询数据库的方法是用
in
,即把查询的字段放到数组里。不可以用for循环,for循环不可控。 - 越主要的函数就应该越简洁,复杂逻辑要拆分。
- A文件导入B文件,B文件导入A文件,即循环导入,会导致一个文件为
undefined
,不好排查,一个解决方法是在函数或类内部导入 - Model 中禁止使用构造函数
# 1.6. 模糊匹配
%key%
,mysql
不会使用索引,速度慢,而key%
会使用索引,即用后面的百分号
# 1.7. 排除字段
- 对象里面有
toJSON
方法的话,序列化结果就是toJSON
函数返回的对象,可以用它来过滤字段。 - 在Model的原型链上添加
toJSON
方法,就不用每建立一个模型实例就手动添加toJSON
方法了。并且添加exclude
数组,可以简便的排除。 - 有个缺陷是只能用于
findOne
,如果是findAll
需要在模型实例上,如Comment.propotype.exclude = [‘id’]
进行排除。