Node.js ORM框架Sequlize之表间关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js ORM框架Sequlize之表间关系相关的知识,希望对你有一定的参考价值。
Sequelize
模型之间存在关联关系,这些关系代表了数据库中对应表之间的主/外
键关系。基于模型关系可以实现关联表之间的连接查询、更新、删除等操作。本文将通过一个示例,介绍模型的定义,创建模型关联关系,模型与关联关系同步数据库,及关系模型的增、删、改、查操作。数据库中的表之间存在一定的关联关系,表之间的关系基于
主/外
键进行关联、创建约束等。关系表中的数据分为1对1
(1:1
)、1对多
(1:M
)、多对多
(N:M
)三种关联关系。在
Sequelize
中建立关联关系,通过调用模型(源模型
)的belongsTo
、hasOne
、hasMany
、belongsToMany
方法,再将要建立关系的模型(目标模型
)做为参数传入即可。这些方法会按以下规则创建关联关系:
hasOne
- 与目标模型建立1:1
关联关系,关联关系(外键)存在于目标模型中。belongsTo
- 与目标模型建立1:1
关联关系,关联关系(外键)存在于源模型中。hasMany
- 与目标模型建立1:N
关联关系,关联关系(外键)存在于目标模型中。belongsToMany
- 与目标模型建立N:M
关联关系,会通过sourceId
和targetId
创建交叉表。
为了能够清楚说明模型关系的定义及关系模型的使用,我们定义如下4个模型对象:
用户
(User
)-与其它模型存在1:1
、1:N
、N:M
用户登录信息
(UserCheckin
)-与User
存在1:1
关系用户地址
(UserAddress
)-与User
存在N:1
关系角色
(Role
)-与User
存在N:M
关系这几个模型的
E-R
结构如下:接下来上代码,代码和瓷土不符,请注意!
代码写的有点low,没办法,!
1 /** 2 * 大家就按照我的步骤来,一点一点,要有耐心哦 3 * 我相信,最后肯定有你想要的!加油 4 */ 5 //引入框架 6 const Sequelize = require(\'sequelize\'); 7 //创建ORM实例 8 const sequelize = new Sequelize(\'sequlizedb\', \'root\', \'guoguo\', 9 { 10 \'dialect\': \'mysql\', // 数据库使用mysql 11 } 12 ); 13 //验证连接 14 sequelize 15 .authenticate() 16 .then(() => { 17 console.log(\'链接成功\'); 18 }) 19 .catch((error) => { 20 console.log(\'链接失败\' + error); 21 }) 22 //模型的创建 23 24 const User = sequelize.define(\'user\', { 25 name: Sequelize.STRING, 26 age: Sequelize.INTEGER, 27 }, { 28 freezeTableName: true, 29 }); 30 31 // User.create({ 32 // name: \'guo\', 33 // age: 25 34 // }) 35 // .then((result) => { 36 // console.log(\'=======添加成功===================\'); 37 // console.log(result); 38 // console.log(\'==========================\'); 39 40 // }) 41 // .catch((error) => { 42 // console.log(\'==========================\'); 43 // console.log(\'添加失败\' + error); 44 // console.log(\'==========================\'); 45 46 // }); 47 48 // const Role=sequelize.define(\'role\',{ 49 // name:{ 50 // type:sequelize.STRING, 51 // } 52 // }, 53 // {freezeTableName:true}); 54 55 56 const Message = sequelize.define(\'message\', { 57 text: Sequelize.STRING, 58 }, { 59 freezeTableName: true, 60 }); 61 62 const Image = sequelize.define(\'image\', { 63 url: Sequelize.STRING, 64 }, { 65 freezeTableName: true, 66 }); 67 //删除表 68 // sequelize.drop() 69 // .then((logging)=>{ 70 // console.log(\'==========================\'); 71 // console.log(\'删除成功!\'+logging); 72 // console.log(\'==========================\'); 73 74 // }) 75 // .catch((error)=>{ 76 // console.log(\'==========================\'); 77 // console.log(\'删除失败\'+error); 78 // console.log(\'==========================\'); 79 80 // }); 81 82 //建立关系 83 // Message.belongsTo(User); 84 // Message.hasMany(Image); 85 //同步到数据库 86 // sequelize.sync({ 87 // force: true, 88 // }).then(() => { 89 // console.log(\'==========================\'); 90 // console.log(\'同步成功\'); 91 // console.log(\'==========================\'); 92 93 // }).catch(() => { 94 // console.log(\'==========================\'); 95 // console.log(\'同步失败\'); 96 // console.log(\'==========================\'); 97 98 // }); 99 100 //cudr 101 function addUers(name, age) { 102 User.create({ 103 name: name, 104 age: age, 105 }).then((log) => { 106 log = JSON.stringify(log); 107 console.log(\'==========================\'); 108 console.log(\'增加用户成功\' + log); 109 console.log(\'==========================\'); 110 111 }).catch((error) => { 112 console.log(\'==========================\'); 113 console.log(\'增加用户失败\' + error); 114 console.log(\'==========================\'); 115 116 }); 117 118 } 119 function addMessage(userId, text) { 120 Message.create({ 121 text: text, 122 userId: userId, 123 }).then((log) => { 124 log = JSON.stringify(log); 125 console.log(\'==========================\'); 126 console.log(\'增加成功!\' + log); 127 console.log(\'==========================\'); 128 129 }).catch((error) => { 130 console.log(\'==========================\'); 131 console.log(\'增加失败!\' + error); 132 console.log(\'==========================\'); 133 134 }); 135 } 136 function addImage(messageId, imageUrl) { 137 Image.create({ 138 url: imageUrl, 139 messageId: messageId, 140 }).then((log) => { 141 log = JSON.stringify(log); 142 console.log(\'==========================\'); 143 console.log(\'添加图片成功\' + log); 144 console.log(\'==========================\'); 145 146 }).catch((error) => { 147 console.log(\'==========================\'); 148 console.log(\'添加图片失败\' + error); 149 console.log(\'==========================\'); 150 151 }); 152 } 153 //测试 154 //addUers(\'杨雪娇\',22); 155 //addMessage(2, \'杨雪娇发来的消息3\'); 156 157 // addImage(5,\'http://3.png\'); 158 // addImage(6,\'http://4.png\'); 159 // addImage(2,\'http://2.png\'); 160 // // 161 function getAllMessage() { 162 Message.findAll({ 163 where: { 164 userId: 2 165 }, 166 include: [ 167 { 168 model: User, 169 attributes: [ 170 \'id\', 171 \'name\', 172 ], 173 }, 174 { 175 model: Image, 176 attributes: [ 177 \'id\', 178 \'url\' 179 ] 180 } 181 ], 182 }).then((result) => { 183 result = JSON.stringify(result); 184 console.log(\'==========================\'); 185 console.log(result); 186 console.log(\'==========================\'); 187 188 189 }).catch((error) => { 190 console.log(\'==========================\'); 191 console.log(\'查询失败\' + error); 192 console.log(\'==========================\'); 193 194 }); 195 } 196 //测试 197 //getAllMessage(); 198 //删除消息 199 function delMessage(userId, messageId) { 200 Message.destroy({ 201 where: { 202 userId: userId, 203 id: messageId, 204 }, 205 206 }).then((log) => { 207 log = JSON.stringify(log); 208 console.log(\'==========================\'); 209 console.log(\'删除消息成功!\' + log); 210 console.log(\'==========================\'); 211 212 }).catch((error) => { 213 console.log(\'==========================\'); 214 console.log(\'删除消息失败!\' + error); 215 console.log(\'==========================\'); 216 217 }); 218 } 219 //测试 220 //测试发现问题 如果不设置级联 则,从属message表的image表记录不会删除,而只是出现对应messageId 为NULL的现象 221 //delMessage(2,4); 222 223 const Role = sequelize.define(\'role\', { 224 name: { 225 type: Sequelize.STRING, allowNull: true, 226 } 227 }, { 228 freezeTableName: true, 229 }); 230 231 232 //对于单个模型的同步 233 // Role.sync().then((log) => { 234 // log = JSON.stringify(log); 235 // console.log(\'==========================\'); 236 // console.log(\'Role表数据同步成功\' + log); 237 // console.log(\'==========================\'); 238 // Role.create({ 239 // name: \'管理员\' 240 // }).then((log) => { 241 // log = JSON.stringify(log); 242 // console.log(\'==========================\'); 243 // console.log(\'添加的数据为\' + log); 244 // console.log(\'==========================\'); 245 246 // }).catch((error) => { 247 // console.log(\'==========================\'); 248 // console.log(\'添加数据失败\' + error); 249 // console.log(\'==========================\'); 250 251 // }); 252 253 // }).catch((error) => { 254 // console.log(\'==========================\'); 255 // console.log(\'Role模型与表数据同步失败\' + error); 256 // console.log(\'==========================\'); 257 258 // }); 259 260 //定义User1模型 261 const User1 = sequelize.define(\'user1\', { 262 name: { 263 type: Sequelize.STRING, 264 validate: { 265 notEmpty: true, 266 len: [2, 30], 267 } 268 }, 269 age: { 270 type: Sequelize.STRING, 271 defaultValue: 21, 272 validate: { 273 isInt: { 274 msg: \'年龄必须是整数!\', 275 } 276 } 277 278 }, 279 email: { 280 type: Sequelize.STRING, 281 validate: { 282 isEmail: true, 283 } 284 }, 285 userpicture: Sequelize.STRING, 286 }, { 287 freezeTableName: true, 288 }); 289 // 290 //同步User1模型 291 // User1.sync().then((log) => { 292 // log = JSON.stringify(log); 293 // console.log(\'==========================\'); 294 // console.log(\'User1表数据同步成功\' + log); 295 // console.log(\'==========================\'); 296 // }).catch((error) => { 297 // console.log(\'==========================\'); 298 // console.log(\'User1模型与表数据同步失败\' + error); 299 // console.log(\'==========================\'); 300 // }); 301 302 function addUser1(userInfo) { 303 User1.create({ 304 name: userInfo.name, 305 age:userInfo.age, 306 email:userInfo.email, 307 }).then((log) => { 308 log = JSON.stringify(log); 309 console.log(\'==========================\'); 310 console.log(\'添加的数据为\' + log); 311 console.log(\'==========================\'); 312 313 }).catch((error) => { 314 console.log(\'==========================\'); 315 console.log(\'添加数据失败\' + error); 316 console.log(\'==========================\'); 317 318 }); 319 } 320 const userInfo={ 321 name:\'郭东生\', 322 //age:0.1,//Validation error: 年龄必须是整数! 323 age:22, 324 email:\'7758@qq.com\', 325 //email:\'7758\',//Validation error: Validation isEmail on email failed 326 } 327 addUser1(userInfo);
以上是关于Node.js ORM框架Sequlize之表间关系的主要内容,如果未能解决你的问题,请参考以下文章
Sequelize简单好上手的node.js ORM框架[MarkDown Note]