一個關於vue+mysql+express的全棧項目(四)------ sequelize中部分解釋

來源:互聯網
上載者:User

標籤:exp   als   應該   詳解   資料   https   fir   fun   ack   

一、模型的引入

引入db.jsconst sequelize = require(‘./db‘)sequelize本身就是一個對象,他提供了眾多的方法,const account = sequelize.model(‘account‘) //擷取account這個模型

二,資料庫基本操作(增、刪、改、查)

增:

account.create(data).then(doc => {    const {user_name, user_id, user_info, avatar} = doc    res.cookie(‘user_id‘, user_id)    return res.json({      code: 0,      data: {        user_name: user_name,        user_id: user_id,        user_info: user_info,        avatar: avatar      }    })  })

刪:

Router.get(‘/cleardata‘, function(req,res) {  // 清空全部資料  poetrylist.destroy({    // where: {id: 123}    // 這裡可以根據我們定義的條件刪除滿足條件的資料  }).then((doc) => {    return res.json({      code: 0,      data: doc    })  })})

改:

Router.post(‘/updataUserInfo‘, function(req,res) {  // 完善使用者資訊  const user_id = req.cookies.user_id  const user_info = req.body.userinfo  account.update(    user_info, // 這裡是我們要更新的欄位,使用逗號隔開    {      ‘where‘: {        ‘user_id‘: user_id // 這裡是我們要更新那條資料的條件      }    }  ).then((doc) => {    return res.json({      code: 0,      data: {        user_info: user_info      }    })  })})

查:

Router.post(‘/getUserInfo‘, function(req,res) {  // 完善使用者資訊  const user_id = req.body.user_id ? req.body.user_id : req.cookies.user_id  account.findOne({    ‘where‘: {‘user_id‘: user_id},    // attributes屬性可以指定返回結果,返回那些欄位的資訊    attributes: [‘user_name‘, ‘avatar‘, ‘user_info‘, ‘user_fans‘, ‘attention‘, ‘poetry_num‘, ‘user_id‘]  }).then((doc) => {    poetrylist.findAll({      where: {‘user_id‘: user_id},      order: [        [‘create_temp‘, ‘DESC‘],      ]    }).then((metadata) => {      return res.json({        code: 0,        data: {          user_info: doc,          list: metadata        }      })    })  })})

這裡使用的是findOne,還有findAll,findById等等,具體參考官方文檔

三、模型關係

這裡就要就要求我們指定資料表之間的關係,這裡直說關係,詳解請看官方文檔

1.一對一(BelongsTo, HasOne )

一對一關聯是由一個單一的外鍵,實現兩個模型之間的精確關聯。BelongsTo關聯表示一對一關聯性的外鍵存在於源模型。var Player = this.sequelize.define(‘player‘, {/* attributes */})  , Team  = this.sequelize.define(‘team‘, {/* attributes */});Player.belongsTo(Team); // 會為Player添加一個teamId 屬性以保持與Team 主鍵的關係預設情況下,一個屬於關係的外鍵將從目標模型的名稱和主鍵名稱產生。目標鍵是位於目標模型上通過源模型外鍵列指向的列。預設情況下,目標鍵是會belongsTo關係中目標模型的主鍵。要使用自訂欄,請用targetKey選項來指定HasOne關聯表示一對一關聯性的外鍵存在於目標模型。雖然被稱為HasOne 關聯,但大多數 1:1關係中通常會使用BelongsTo 關聯,因為BelongsTo 會在源模型中添加外鍵,而HasOne 則會在目標模型中添加外鍵。HasOne 與BelongsTo 的不同在1:1 的關係中,可使用HasOne 或BelongsTo來定義。但它們的使用情境有所不同

 

2.一對多(HasMany)

One-To-Many關聯是指一個源模型串連多個目標模型。反之目標模型都會有一個明確的源。var User = sequelize.define(‘user‘, {/* ... */})var Project = sequelize.define(‘project‘, {/* ... */}) // 定義 hasMany 關聯Project.hasMany(User, {as: ‘Workers‘})會向 User 中添加一個projectId或project_id屬性。Project 的執行個體中會有訪問器getWorkers 和 setWorkers。這是一種單向關聯方式,如果兩個模型間還有其它關聯方式請參考下面的多對多關係。

3.多對多(Belongs-To-Many)

多對多(Belongs-To-Many)關聯Belongs-To-Many 關聯是指一個源模型串連多個目標模型。而且,目標模型也可以有多個相關的源。Project.belongsToMany(User, {through: ‘UserProject‘});User.belongsToMany(Project, {through: ‘UserProject‘});這會建立一個新模型UserProject其中會projectId和userId兩個外鍵。是否使用駝峰命名取決與相關聯的兩個表。定義through選項後,Sequelize會嘗試自動產生名字,但並一定符合邏輯。在本例中,會為User添加方法 getUsers, setUsers, addUser,addUsers to Project, and getProjects, setProjects, addProject, and addProjects有時我們會對串連的模型進行重新命名,同樣可以使用as實現。

四、多表聯查(我們進行使用者資訊模型和文章模型的聯集查詢)如的結果

 

const sequelize = require(‘./db‘)const account = sequelize.model(‘account‘) // 擷取模型const poetrylist = sequelize.model(‘poetrylist‘)poetrylist.belongsTo(account, {foreignKey: ‘user_id‘, targetKey: ‘user_id‘}); // 指定模型關係可查詢的外鍵欄位

 

Router.get(‘/getPoetryList‘, function(req, res) {  // 擷取文章列表  poetrylist.findAll({    include: [{ // 通過include欄位執行要聯合那個模型進行查詢      model: account, // 執行模型      attributes: [‘user_name‘, ‘avatar‘, ‘user_id‘] // 想要只選擇某些屬性可以使用 attributes: [‘foo‘, ‘bar‘]    }],    attributes: [      ‘content‘,      ‘poetrylist_id‘,      ‘recommend‘,      ‘star‘,      ‘user_id‘,      ‘create_temp‘,      ‘guest_num‘,      ‘transmit_content‘,      ‘transmit_user_id‘,      ‘transmit_user_name‘,      ‘transmit_poetrylist_id‘,      ‘id‘],    order: [ // 使用order進行排序      [‘create_temp‘, ‘DESC‘], // 這;i按照時間順序進行排序    ]  }).then((doc) => {    supportlist.findAll({      // 擷取目前使用者的點贊文章的列表      where: {        "user_id": req.cookies.user_id      }    }).then(suplist => {      // 資料處理      for (let i = 0; i < doc.length; i++) {        doc[i].dataValues.isAttention = false        if (suplist.length) {          for (let j = 0; j < suplist.length; j++) {            if (doc[i].dataValues.poetrylist_id === suplist[j].dataValues.poetrylist_id){              doc[i].dataValues.isAttention = true            }          }        } else {          doc[i].dataValues.isAttention = false        }      }      return res.json({        code: 0,        data: doc,        suplist: suplist      })    })  })})

以上查詢代碼轉換位sql語句為:

五、事物

Transaction是Sequelize中用於實現事務功能的子類,通過調用Sequelize.transaction()方法可以建立一個該類的執行個體。在Sequelize中,支援自動認可/復原,也可以支援使用者手動提交/復原。

Sequelize有兩種使用事務的方式:

  • 基於Promise結果鏈的自動認可/復原
  • 另一種是不自動認可和復原,而由使用者控制事務
受管理的事務(auto-callback)

受管理的事務會自動認可或復原,你可以向sequelize.transaction方法傳遞一個回呼函數來啟動一個事務。

需要注意,在這種方式下傳遞給回呼函數的transaction會返回一個promise鏈,在promise鏈中(thencatch)中並不能調用t.commit()t.rollback()來控制事務。在這種方式下,如果使用事務的所有promise鏈都執行成功,則自動認可;如果其中之一執行失敗,則自動復原。

return sequelize.transaction(function (t) {  // 要確保所有的查詢鏈都有return返回  return User.create({    firstName: ‘Abraham‘,    lastName: ‘Lincoln‘  }, {transaction: t}).then(function (user) {    return user.setShooter({      firstName: ‘John‘,      lastName: ‘Boothe‘    }, {transaction: t});  });}).then(function (result) {  // Transaction 會自動認可  // result 是事務回調中使用promise鏈中執行結果}).catch(function (err) {  // Transaction 會自動復原  // err 是事務回調中使用promise鏈中的異常結果});

 

不受管理的事務(then-callback)

不受管理的事務需要你強制提交或復原,如果不進行這些操作,事務會一直保持掛起狀態直到逾時。

啟動一個不受管理的事務,同樣是調用sequelize.transaction()方法,但不傳遞迴調函數參數(仍然可以傳遞選項參數)。然後可以在其返回的promisethen方法中手工控制事務:

Router.post(‘/subscription‘, function (req, res) {  // 關注功能  const data = {    user_id: req.cookies.user_id,    target_id: req.body.target_id  }  // Transaction是Sequelize中用於實現事務功能的子類,  // 通過調用Sequelize.transaction()方法可以建立一個該類的執行個體。  // 在Sequelize中,支援自動認可/復原,也可以支援使用者手動提交/復原。  return sequelize.transaction({    autocommit: true  }, t => {    return attentionlist.findOne({      ‘where‘: {        ‘user_id‘: req.cookies.user_id,        ‘target_id‘: req.body.target_id      }    },{transaction: t}).then(doc => {      if (!doc) {        return attentionlist.create(data,{transaction: t}).then(ret => {          return account.findOne({            ‘where‘: {‘user_id‘: req.cookies.user_id}          }, {transaction: t}).then(rets => {            // increment自增函數            return rets.increment(‘attention‘).then(retss => {                            return ‘success‘            })          })        }, {transaction: t}).then(docs => {          return docs        })      } else {        return 100      }    })  }).then(result => {    return res.json({      code: 0,      data: result    })  })})

 結束:一共寫了四篇文章,也不知道說清楚了沒有,好多覺得該說的,大家應該都會知道,所以沒有很詳細的進行說明,如果還有不清楚的地方可以參考github上的源碼:https://github.com/songdongdong123/vue_chat

一個關於vue+mysql+express的全棧項目(四)------ sequelize中部分解釋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.