TIP
记录使用sequelize配合koa开发后台。
安装
npm i -S sequelize
连接数据库(mysql),若使用日期,则需设置时区
js
new Sequelize(database, Config.username, Config.password, {
host: Config.host,
dialect: Config.dialect,
pool: {
max: 5,
min: 0,
idle: 10000
},
timezone: '+08:00' // 时区设置
})
默认情况下sequelize会自动给模型设置createdAt和updatedAt
,日期类型
js
sequelize.define('User', {
// ... (attributes)
}, {
// timestamps: false, // 关闭自动添加时间
timestamps: true,
// 不添加createdAt
createdAt: false,
// updatedAt改为updateTimestamp
updatedAt: 'updateTimestamp'
});
创建外键关联表及后续使用
js
const { Sequelize, Op } = require('sequelize')
const sequelize = new Sequlize(...);// 连接数据库 详细参数省略
const Device = sequelize.define('device'...); // device模型 详细参数省略
const Area = sequelize.define('area'...); // area模型 详细参数省略
// device表和area表 建立关联 必须要表创建后才可以
// device表中 有个areaId指向area中的id
Device.belongsTo(Area, { foreignKey: 'areaId', targetKey: 'id' });
// 使用 查询device表 device对象同级包含area表的属性
await Device.findAndCountAll({
attributes: {
include: [
[Area.sequelize.col('area.name'), 'areaName'], // area.name改为 areaName 避免与device中的属性冲突
]
},
include: {
model: Area,
attributes: [],
}
})
// 使用 查询device表 device对象 加入一个area属性 为查询出来的area对象
await Device.findAndCountAll({
include: {
model: Area,
}
})
要对查询出来的列表数据进行一些特殊处理,最好还是转一下
js
data = JSON.parse(JSON.stringfy(result));
查询返回指定属性
js
// 只返回 id 和 name
await Device.findAll({
attributes: {
include: ['id', 'name']
}
})
查询返回排除属性
js
await Device.findAll({
attributes: {
exclude: ['createdAt']
}
})
多对多关联
js
// 自动创建关联表
User.belongsToMany(Role, { through: UserRole });
Role.belongsToMany(User, { through: UserRole });
// 创建用户 添加角色 添加用户角色关联
const roles = await Role.findAll({ where: { roleValue: { [Role.Op.in]: role } } });
const user = await User.create({ username, password: hash, realName, avatar, desc });
const userRole = await user.addRoles(roles, { through: { selfGranted: false } }); // 添加关联
user.addRole(role) // 单个角色
user.addRole(roles) // 多个角色
user.getRoles()
user.countRoles()
user.hasRole(role)
user.hasRoles(roles)
user.setRoles()
user.removeRole(role)
user.removeRoles(roles)
user.createRole({xx,xx})