[TOC]
前言
刚接触nodejs新人一枚,在后端服务框架正在学习eggjs,其中数据库方面ORM框架使用的egg-sequelize,碰到一些问题,回过来学习下sequelize。
学习中主要参考sequelize官网文档
环境
"sequelize": "^4.37.3"
"mysql2": "^1.5.3"
快速开始
建立连接
var Sequelize = require('sequelize')
var sequelize = new Sequelize('seq_test', 'db_name', 'password, {
host: 'localhost',
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 10000
},
timezone: '+08:00' // 东八时区
});
sequelize
.authenticate() // 这个方法用于测试连接是否可用
.then(function(err) {
console.log('Connection has been established successfully.');
})
.catch(function(err) {
console.log('Unable to connect to the database:', err);
});
创建model并查询
var User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
});
// force: 这个值为true,则会检查表是否已经存在,如果存在则删除该表重新创建
User.sync({
force: true
}).then(function() {
// Table created
return User.create({
firstName: 'John',
lastName: 'Hancock'
});
}).then(function() {
User.findAll().then(function(users) {
console.log(users)
})
})
一对多
在代码中要注意的是hasMany
这个方法,其中使用到as时候,才会给示例注入get方法去获取一对多的数据,当我去掉as的时候,使用getProjects无法获取数据,暂没找到原因,以后有时间再去研究。
// 建立模型
var User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
});
var Project = sequelize.define('project', {
name: {
type: Sequelize.STRING
}
})
// User与Project一对多关系
User.hasMany(Project, {as: 'Workers'}) //方式一
// User.hasMany(Project) // 方式二
// 创建表,因为外键关系,所以要先创建User表,再创建Project
var p = User.sync({
force: true
}).then(function() {
var p2 = Project.sync({
force: true
});
})
// 初始化数据
p.then(function() {
return User.create({
firstName: 'John',
lastName: 'Hancock'
})
}).then(function() {
return Project.create({
name: '工作1',
userId: 1
})
}).then(function() {
return Project.create({
name: '工作2',
userId: 1
})
}).then(function() { //查询
console.log('查询所有数据:')
User.findAll({
include: ['Workers'] // 在hasMany中使用as,可以直接使用
// include: [{ //方式二:未在hasMany中使用as
// model: Project,
// attributes: ['name']
// }]
}).then(function(res) {
console.log(JSON.stringify(res))
})
}).then(function() {
console.log('查询单独数据:')
User.findAll({
}).then(function(res) {
console.log('res:'+JSON.stringify(res))
res.getWorkers().then(function(p){ // getWorkers 通过hasMany 自动注入,可以使用as别名
console.log('p:'+JSON.stringify(p))
})
})
})
多对多
Project.belongsToMany(User, { // 方式1:不带as,会自动生成getUsers,setUsers,addUser,addUsers
through: 'UserProject'
});
User.belongsToMany(Project, {// 方式2:带as,会自动生成getTasks,setTasks,两个add方法(研究时候未验证,到时候做的时候具体去看,再更正)
as: 'Tasks', //
through: 'UserProject'
});
//查询年
return User.findAll({
// include: ['Tasks'] // 在hasMany中使用as,可以直接使用
include: [{
model: Project,
attributes: ['name'],
through: {
attributes: [] // 不返回关系表数据
},
}]
}).then(function(res) {
console.log('所有数据结果:' + JSON.stringify(res))
})
//调用get方式获取数据,问题是,每条数据会自动带上UserProject中间表,通过joinTableAttributes可以解决,暂时未找到其他方案
User.findOne({}).then(function(res) {
console.log('res:' + JSON.stringify(res))
res.getProjects({
attributes: ['name'],
joinTableAttributes:[] // 将每条数据中间表记录剔除
}).then(function(p) {
console.log('单独数据:' + JSON.stringify(p))
})
})