浅谈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 相关文章推荐
jQuery autocomplete插件修改
Apr 17 Javascript
Draggable Elements 元素拖拽功能实现代码
Mar 30 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
Apr 02 Javascript
JS实现切换标签页效果实例代码
Nov 01 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
Jan 26 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
Nov 24 Javascript
JavaScript笛卡尔积超简单实现算法示例
Jul 30 Javascript
JavaScript new对象的四个过程实例浅析
Jul 31 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
Apr 28 Javascript
javascript实现动态时钟的启动和停止
Jul 29 Javascript
基于vue-cli3创建libs库的实现方法
Dec 04 Javascript
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
数字转英文
2006/12/06 PHP
mysql中存储过程、函数的一些问题
2007/02/14 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
php中namespace及use用法分析
2016/12/06 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
计算机专业学生的自我评价
2013/12/15 职场文书
学生党员公开承诺书
2014/05/28 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS