淺談Node.js ORM框架Sequlize之表間關(guān)系
Sequelize模型之間存在關(guān)聯(lián)關(guān)系,這些關(guān)系代表了數(shù)據(jù)庫中對(duì)應(yīng)表之間的主/外鍵關(guān)系?;谀P完P(guān)系可以實(shí)現(xiàn)關(guān)聯(lián)表之間的連接查詢、更新、刪除等操作。本文將通過一個(gè)示例,介紹模型的定義,創(chuàng)建模型關(guān)聯(lián)關(guān)系,模型與關(guān)聯(lián)關(guān)系同步數(shù)據(jù)庫,及關(guān)系模型的增、刪、改、查操作。
數(shù)據(jù)庫中的表之間存在一定的關(guān)聯(lián)關(guān)系,表之間的關(guān)系基于主/外鍵進(jìn)行關(guān)聯(lián)、創(chuàng)建約束等。關(guān)系表中的數(shù)據(jù)分為1對(duì)1(1:1)、1對(duì)多(1:M)、多對(duì)多(N:M)三種關(guān)聯(lián)關(guān)系。
在Sequelize中建立關(guān)聯(lián)關(guān)系,通過調(diào)用模型(源模型)的belongsTo、hasOne、hasMany、belongsToMany方法,再將要建立關(guān)系的模型(目標(biāo)模型)做為參數(shù)傳入即可。這些方法會(huì)按以下規(guī)則創(chuàng)建關(guān)聯(lián)關(guān)系:
hasOne - 與目標(biāo)模型建立1:1關(guān)聯(lián)關(guān)系,關(guān)聯(lián)關(guān)系(外鍵)存在于目標(biāo)模型中。
belongsTo - 與目標(biāo)模型建立1:1關(guān)聯(lián)關(guān)系,關(guān)聯(lián)關(guān)系(外鍵)存在于源模型中。
hasMany - 與目標(biāo)模型建立1:N關(guān)聯(lián)關(guān)系,關(guān)聯(lián)關(guān)系(外鍵)存在于目標(biāo)模型中。
belongsToMany - 與目標(biāo)模型建立N:M關(guān)聯(lián)關(guān)系,會(huì)通過sourceId和targetId創(chuàng)建交叉表。
為了能夠清楚說明模型關(guān)系的定義及關(guān)系模型的使用,我們定義如下4個(gè)模型對(duì)象:
用戶(User)-與其它模型存在1:1、1:N、N:M
用戶登錄信息(UserCheckin)-與User存在1:1關(guān)系
用戶地址(UserAddress)-與User存在N:1關(guān)系
角色(Role)-與User存在N:M關(guān)系
這幾個(gè)模型的E-R結(jié)構(gòu)如下:
接下來上代碼,代碼和瓷土不符,請(qǐng)注意!
代碼寫的有點(diǎn)low,沒辦法,!
/** * 大家就按照我的步驟來,一點(diǎn)一點(diǎn),要有耐心哦 * 我相信,最后肯定有你想要的!加油 */ //引入框架 const Sequelize = require('sequelize'); //創(chuàng)建ORM實(shí)例 const sequelize = new Sequelize('sequlizedb', 'root', 'guoguo', { 'dialect': 'mysql', // 數(shù)據(jù)庫使用mysql } ); //驗(yàn)證連接 sequelize .authenticate() .then(() => { console.log('鏈接成功'); }) .catch((error) => { console.log('鏈接失敗' + error); }) //模型的創(chuàng)建 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('=========================='); // }); //建立關(guān)系 // Message.belongsTo(User); // Message.hasMany(Image); //同步到數(shù)據(jù)庫 // 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('=========================='); }); } //測(cè)試 //addUers('楊雪嬌',22); //addMessage(2, '楊雪嬌發(fā)來的消息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('=========================='); }); } //測(cè)試 //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('=========================='); }); } //測(cè)試 //測(cè)試發(fā)現(xiàn)問題 如果不設(shè)置級(jí)聯(lián) 則,從屬message表的image表記錄不會(huì)刪除,而只是出現(xiàn)對(duì)應(yīng)messageId 為NULL的現(xiàn)象 //delMessage(2,4); const Role = sequelize.define('role', { name: { type: Sequelize.STRING, allowNull: true, } }, { freezeTableName: true, }); //對(duì)于單個(gè)模型的同步 // Role.sync().then((log) => { // log = JSON.stringify(log); // console.log('=========================='); // console.log('Role表數(shù)據(jù)同步成功' + log); // console.log('=========================='); // Role.create({ // name: '管理員' // }).then((log) => { // log = JSON.stringify(log); // console.log('=========================='); // console.log('添加的數(shù)據(jù)為' + log); // console.log('=========================='); // }).catch((error) => { // console.log('=========================='); // console.log('添加數(shù)據(jù)失敗' + error); // console.log('=========================='); // }); // }).catch((error) => { // console.log('=========================='); // console.log('Role模型與表數(shù)據(jù)同步失敗' + 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: '年齡必須是整數(shù)!', } } }, 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表數(shù)據(jù)同步成功' + log); // console.log('=========================='); // }).catch((error) => { // console.log('=========================='); // console.log('User1模型與表數(shù)據(jù)同步失敗' + 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('添加的數(shù)據(jù)為' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('添加數(shù)據(jù)失敗' + error); console.log('=========================='); }); } const userInfo={ name:'郭東生', //age:0.1,//Validation error: 年齡必須是整數(shù)! age:22, email:'7758@qq.com', //email:'7758',//Validation error: Validation isEmail on email failed } addUser1(userInfo);
以上這篇淺談Node.js ORM框架Sequlize之表間關(guān)系就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解NodeJS Https HSM雙向認(rèn)證實(shí)現(xiàn)
這篇文章主要介紹了詳解NodeJS Https HSM雙向認(rèn)證實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03node.js 中間件express-session使用詳解
這篇文章主要給大家介紹了node.js中間件express-session使用的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05node.js中的http.request.end方法使用說明
這篇文章主要介紹了node.js中的http.request.end方法使用說明,本文介紹了http.request.end的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12Node.js服務(wù)端實(shí)戰(zhàn)之服務(wù)啟動(dòng)過程詳解
這篇文章主要為大家介紹了Node.js服務(wù)端實(shí)戰(zhàn)之服務(wù)啟動(dòng)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12前端必會(huì)的nodejs知識(shí)工具模塊使用示例詳解
這篇文章主要為大家介紹了前端必會(huì)的nodejs知識(shí)工具模塊使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Node做中轉(zhuǎn)服務(wù)器轉(zhuǎn)發(fā)接口
這篇文章主要介紹了Node做中轉(zhuǎn)服務(wù)器轉(zhuǎn)發(fā)接口的相關(guān)資料,需要的朋友可以參考下2017-10-10node.js回調(diào)函數(shù)之阻塞調(diào)用與非阻塞調(diào)用
本文重點(diǎn)給大家介紹node.js回調(diào)函數(shù)之阻塞調(diào)用和非阻塞調(diào)用,涉及到node.js回調(diào)函數(shù)的相關(guān)知識(shí),對(duì)本文感興趣的朋友一起學(xué)習(xí)吧2015-11-11