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,没办法,!
/** * 大家就按照我的步骤来,一点一点,要有耐心哦 * 我相信,最后肯定有你想要的!加油 */ //引入框架 const Sequelize = require('sequelize'); //创建ORM实例 const sequelize = new Sequelize('sequlizedb', 'root', 'guoguo', { 'dialect': 'mysql', // 数据库使用mysql } ); //验证连接 sequelize .authenticate() .then(() => { console.log('链接成功'); }) .catch((error) => { console.log('链接失败' + error); }) //模型的创建 const User = sequelize.define('user', { name: Sequelize.STRING, age: Sequelize.INTEGER, }, { freezeTableName: true, }); // User.create({ // name: 'guo', // age: 25 // }) // .then((result) => { // console.log('=======添加成功==================='); // console.log(result); // console.log('=========================='); // }) // .catch((error) => { // console.log('=========================='); // console.log('添加失败' + error); // console.log('=========================='); // }); // const Role=sequelize.define('role',{ // name:{ // type:sequelize.STRING, // } // }, // {freezeTableName:true}); const Message = sequelize.define('message', { text: Sequelize.STRING, }, { freezeTableName: true, }); const Image = sequelize.define('image', { url: Sequelize.STRING, }, { freezeTableName: true, }); //删除表 // sequelize.drop() // .then((logging)=>{ // console.log('=========================='); // console.log('删除成功!'+logging); // console.log('=========================='); // }) // .catch((error)=>{ // console.log('=========================='); // console.log('删除失败'+error); // console.log('=========================='); // }); //建立关系 // Message.belongsTo(User); // Message.hasMany(Image); //同步到数据库 // sequelize.sync({ // force: true, // }).then(() => { // console.log('=========================='); // console.log('同步成功'); // console.log('=========================='); // }).catch(() => { // console.log('=========================='); // console.log('同步失败'); // console.log('=========================='); // }); //cudr function addUers(name, age) { User.create({ name: name, age: age, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('增加用户成功' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('增加用户失败' + error); console.log('=========================='); }); } function addMessage(userId, text) { Message.create({ text: text, userId: userId, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('增加成功!' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('增加失败!' + error); console.log('=========================='); }); } function addImage(messageId, imageUrl) { Image.create({ url: imageUrl, messageId: messageId, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('添加图片成功' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('添加图片失败' + error); console.log('=========================='); }); } //测试 //addUers('杨雪娇',22); //addMessage(2, '杨雪娇发来的消息3'); // addImage(5,'http://3.png'); // addImage(6,'http://4.png'); // addImage(2,'http://2.png'); // // function getAllMessage() { Message.findAll({ where: { userId: 2 }, include: [ { model: User, attributes: [ 'id', 'name', ], }, { model: Image, attributes: [ 'id', 'url' ] } ], }).then((result) => { result = JSON.stringify(result); console.log('=========================='); console.log(result); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('查询失败' + error); console.log('=========================='); }); } //测试 //getAllMessage(); //删除消息 function delMessage(userId, messageId) { Message.destroy({ where: { userId: userId, id: messageId, }, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('删除消息成功!' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('删除消息失败!' + error); console.log('=========================='); }); } //测试 //测试发现问题 如果不设置级联 则,从属message表的image表记录不会删除,而只是出现对应messageId 为NULL的现象 //delMessage(2,4); const Role = sequelize.define('role', { name: { type: Sequelize.STRING, allowNull: true, } }, { freezeTableName: true, }); //对于单个模型的同步 // Role.sync().then((log) => { // log = JSON.stringify(log); // console.log('=========================='); // console.log('Role表数据同步成功' + log); // console.log('=========================='); // Role.create({ // name: '管理员' // }).then((log) => { // log = JSON.stringify(log); // console.log('=========================='); // console.log('添加的数据为' + log); // console.log('=========================='); // }).catch((error) => { // console.log('=========================='); // console.log('添加数据失败' + error); // console.log('=========================='); // }); // }).catch((error) => { // console.log('=========================='); // console.log('Role模型与表数据同步失败' + error); // console.log('=========================='); // }); //定义User1模型 const User1 = sequelize.define('user1', { name: { type: Sequelize.STRING, validate: { notEmpty: true, len: [2, 30], } }, age: { type: Sequelize.STRING, defaultValue: 21, validate: { isInt: { msg: '年龄必须是整数!', } } }, email: { type: Sequelize.STRING, validate: { isEmail: true, } }, userpicture: Sequelize.STRING, }, { freezeTableName: true, }); // //同步User1模型 // User1.sync().then((log) => { // log = JSON.stringify(log); // console.log('=========================='); // console.log('User1表数据同步成功' + log); // console.log('=========================='); // }).catch((error) => { // console.log('=========================='); // console.log('User1模型与表数据同步失败' + error); // console.log('=========================='); // }); function addUser1(userInfo) { User1.create({ name: userInfo.name, age:userInfo.age, email:userInfo.email, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('添加的数据为' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('添加数据失败' + error); console.log('=========================='); }); } const userInfo={ name:'郭东生', //age:0.1,//Validation error: 年龄必须是整数! age:22, email:'7758@qq.com', //email:'7758',//Validation error: Validation isEmail on email failed } addUser1(userInfo);
以上这篇浅谈Node.js ORM框架Sequlize之表间关系就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 好薇2024《兵哥哥》1:124K黄金母盘[WAV+CUE]
- 胡歌.2006-珍惜(EP)【步升大风】【FLAC分轨】
- 洪荣宏.2014-拼乎自己看【华特】【WAV+CUE】
- 伊能静.1999-从脆弱到勇敢1987-1996精选2CD【华纳】【WAV+CUE】
- 刘亮鹭《汽车DJ玩主》[WAV+CUE][1.1G]
- 张杰《最接近天堂的地方》天娱传媒[WAV+CUE][1.1G]
- 群星《2022年度发烧天碟》无损黑胶碟 2CD[WAV+CUE][1.4G]
- 罗文1983-罗文甄妮-射雕英雄传(纯银AMCD)[WAV+CUE]
- 群星《亚洲故事香港纯弦》雨果UPMAGCD2024[低速原抓WAV+CUE]
- 群星《经典咏流传》限量1:1母盘直刻[低速原抓WAV+CUE]
- 庾澄庆1993《老实情歌》福茂唱片[WAV+CUE][1G]
- 许巍《在别处》美卡首版[WAV+CUE][1G]
- 林子祥《单手拍掌》华纳香港版[WAV+CUE][1G]
- 郑秀文.1997-我们的主题曲【华纳】【WAV+CUE】
- 群星.2001-生命因爱动听电影原创音乐AVCD【MEDIA】【WAV+CUE】