浅谈Node.js ORM框架Sequlize之表间关系


Posted in Javascript onJuly 24, 2017

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结构如下:

浅谈Node.js ORM框架Sequlize之表间关系

接下来上代码,代码和瓷土不符,请注意!

代码写的有点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之表间关系就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript生成json的函数代码(可以用php的json_decode解码)
Jun 11 Javascript
解决IE6的PNG透明JS插件使用介绍
Apr 17 Javascript
js获取当月最后一天实例代码
Nov 19 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
js 弹出虚拟键盘修改密码的简单实例
Oct 10 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
Dec 22 Javascript
vue.js 上传图片实例代码
Jun 22 Javascript
微信小程序三级联动地址选择器的实例代码
Jul 12 Javascript
原生JavaScript实现remove()和recover()功能示例
Jul 24 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
Jan 07 Javascript
JS创建自定义对象的六种方法总结
Dec 15 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
Jul 24 #Javascript
jQuery实现拼图小游戏(实例讲解)
Jul 24 #jQuery
php register_shutdown_function函数详解
Jul 23 #Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
Jul 23 #Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 #Javascript
jquery实现下拉菜单的手风琴效果
Jul 23 #jQuery
基于Vue.js实现tab滑块效果
Jul 23 #Javascript
You might like
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
python交换两个变量的值方法
2019/01/12 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
简单html5代码获取地理位置
2014/03/31 HTML / CSS
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
库房主管岗位职责
2013/12/31 职场文书
思想汇报格式
2014/01/05 职场文书
发展部经理职责规定
2014/02/22 职场文书
战略合作意向书范本
2014/04/01 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
2015年仓库工作总结
2015/04/09 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
python游戏开发之pygame实现接球小游戏
2022/04/22 Python