欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-11-20 09:53:24
sequelize模型之间存在关联关系,这些关系代表了数据库中对应表之间的主/外键关系。基于模型关系可以实现关联表之间的连接查询、更新、删除等操作。本文将通过一个示例,介绍...

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