浅谈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 函数参数是传值(byVal)还是传址(byRef) 分享
Jul 02 Javascript
关于onchange事件在IE和FF下的表现及解决方法
Mar 08 Javascript
js中数组排序sort方法的原理分析
Nov 20 Javascript
浅谈javascript中for in 和 for each in的区别
Apr 23 Javascript
Backbone.js的Hello World程序实例
Jun 19 Javascript
总结jQuery插件开发中的一些要点
May 16 Javascript
基于cookie实现zTree树刷新后展开状态不变
Feb 28 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
vue 录制视频并压缩视频文件的方法
Jul 27 Javascript
vue实现记事本功能
Jun 26 Javascript
js使用文件流下载csv文件的实现方法
Jul 15 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
php 404错误页面实现代码
2009/06/22 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
php出现web系统多域名登录失败的解决方法
2014/09/30 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
浅析JS中回调函数及用法
2018/07/25 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
pyhton列表转换为数组的实例
2018/04/04 Python
python的中异常处理机制
2018/08/30 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
python使用建议与技巧分享(二)
2020/08/17 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
AJAX都有哪些有点和缺点
2012/11/03 面试题
工程测量与监理专业应届生求职信
2013/11/27 职场文书
车辆转让协议书
2014/04/15 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
redis限流的实际应用
2021/04/24 Redis