[TOC]
前言
剛接觸nodejs新人一枚钳踊,在后端服務(wù)框架正在學(xué)習(xí)eggjs,其中數(shù)據(jù)庫方面ORM框架使用的egg-sequelize勿侯,碰到一些問題拓瞪,回過來學(xué)習(xí)下sequelize。
學(xué)習(xí)中主要參考sequelize官網(wǎng)文檔
環(huán)境
"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' // 東八時區(qū)
});
sequelize
.authenticate() // 這個方法用于測試連接是否可用
.then(function(err) {
console.log('Connection has been established successfully.');
})
.catch(function(err) {
console.log('Unable to connect to the database:', err);
});
創(chuàng)建model并查詢
var User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
});
// force: 這個值為true助琐,則會檢查表是否已經(jīng)存在祭埂,如果存在則刪除該表重新創(chuàng)建
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方法去獲取一對多的數(shù)據(jù)蛆橡,當(dāng)我去掉as的時候舌界,使用getProjects無法獲取數(shù)據(jù),暫沒找到原因航罗,以后有時間再去研究禀横。
// 建立模型
var User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
});
var Project = sequelize.define('project', {
name: {
type: Sequelize.STRING
}
})
// User與Project一對多關(guān)系
User.hasMany(Project, {as: 'Workers'}) //方式一
// User.hasMany(Project) // 方式二
// 創(chuàng)建表,因?yàn)橥怄I關(guān)系粥血,所以要先創(chuàng)建User表柏锄,再創(chuàng)建Project
var p = User.sync({
force: true
}).then(function() {
var p2 = Project.sync({
force: true
});
})
// 初始化數(shù)據(jù)
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('查詢所有數(shù)據(jù):')
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('查詢單獨(dú)數(shù)據(jù):')
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方法(研究時候未驗(yàn)證抬闷,到時候做的時候具體去看,再更正)
as: 'Tasks', //
through: 'UserProject'
});
//查詢年
return User.findAll({
// include: ['Tasks'] // 在hasMany中使用as耕突,可以直接使用
include: [{
model: Project,
attributes: ['name'],
through: {
attributes: [] // 不返回關(guān)系表數(shù)據(jù)
},
}]
}).then(function(res) {
console.log('所有數(shù)據(jù)結(jié)果:' + JSON.stringify(res))
})
//調(diào)用get方式獲取數(shù)據(jù)笤成,問題是,每條數(shù)據(jù)會自動帶上UserProject中間表眷茁,通過joinTableAttributes可以解決炕泳,暫時未找到其他方案
User.findOne({}).then(function(res) {
console.log('res:' + JSON.stringify(res))
res.getProjects({
attributes: ['name'],
joinTableAttributes:[] // 將每條數(shù)據(jù)中間表記錄剔除
}).then(function(p) {
console.log('單獨(dú)數(shù)據(jù):' + JSON.stringify(p))
})
})