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

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,没办法,!

{ 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,});

const Image = sequelize.define('image',{
url: Sequelize.STRING,});
//删除
// 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,'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,}
},});

//对于单个模型的同步
// 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',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,});
//
//同步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之表间关系就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。

相关文章

现在的js代码都是这种高级点的方式语法 , 就是ts语法 ,要使用ts语法那就要先安装一下 先安装nodejs最...
nvm是node版本管理工具 为了解决node各种版本存在不兼容现象 nvm是让你在同一台机器上安装和切换不同版...
1、安装nodejs 2、在项目文件夹目录下创建一个js文件,命名server.js(自定义名称),内容如下 3、打开命令...
1.连接路径:path.join([path1][, path2][, ...]) path.join()方法可以连接任意多个路径字符串。要连接...
简介 1.aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个...
定义 Object.keys 定义:返回一个对象可枚举属性的字符串数组; Object.getOwnPropertyNames 定义:返回...