Sequelize 使用

sequelize.png

說起ORM,Object Relational Mapping蘸炸,有Hibernate躬络,JPA等成熟的Java框架。 Sequelize是JS端的hibernate搭儒,可以和十分著名的Express js server一起使用穷当,完成server端到數據庫的CRUD等等操作提茁。

Promise based, Sequelize和Hibernate最大的區(qū)別在于,它的調用基于bluebird的異步調用引擎馁菜,我們知道茴扁,在Javascript的世界里,很多調用是通過Callback函數來完成的而并非是順序執(zhí)行的火邓,使用Sequelize丹弱,我們也要注意這一點。

從模型說起

Promise要把Javascript Object轉換成數據庫的一行铲咨,首先躲胳,它需要知道數據庫表結構,當然纤勒,Sequelize主要是支持Postgres, Mysql之類的關系型數據庫坯苹。

npm install -g sequelize-auto
sequelize-auto -h 127.0.0.1 -d ocsp -u root -x 123 -p 3306 ---dialect mysql -o "./server/models/"

sequelize-auto是一個幫助我們快速生成表結構的工具,上面給出了一個通過連接mysql生成數據庫表結構代碼的例子摇天。

/* jshint indent: 2 */
"use strict";
module.exports = function(sequelize, DataTypes) {
  return sequelize.define('STREAM_EVENT', {
    id: {
      type: DataTypes.INTEGER(16),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false
   }, {
    createdAt: false,
    updatedAt: false,
    tableName: 'STREAM_EVENT'
  });
};

首先生成的代碼沒有使用"use strict";粹湃,如果是需要運行在嚴格模式下,需要自己添加泉坐。其次为鳄,createdAt和updateAt要寫成false,默認true需要數據庫表里面有這兩個字段腕让。

錯誤處理

Javascript Promise的錯誤處理有讓人迷糊的地方孤钦。

p.then(onFulfilled, onRejected);

p.then(function(value) {
   // fulfillment
  }, function(reason) {
  // rejection
});
p.catch(onRejected);

p.catch(function(reason) {
   // 拒絕
});

首先是ES6里面Promise的then提供兩個參數,分別是success和error的兩個callback函數纯丸,另外偏形,Promise提供catch方法,用來處理error的情況觉鼻,所以從某種角度上說俊扭,第二個callback函數的作用和catch是一樣的。

Tips: 在這里坠陈,我們推薦使用catch函數萨惑,因為catch返回的還是一個Promise,這對于Promise chain的調用很有好處仇矾,例如官方給出了以下例子咒钟。可以看出若未,catch后面還有then。

Warning:在最新版本的Angular里面倾鲫,已經徹底刪除了Promise的success和error方法粗合,因為對Promise chain的傳遞有影響萍嬉,一般then(function(item){})這里面的item,要再次解析隙疚,例如包裝在item.data里面壤追,而在success中則直接是data的值,這對于Promise chain有混淆供屉,所以success被廢棄了行冰,這里不推薦使用。

var p1 = new Promise(function(resolve, reject) {
  resolve('Success');
});

p1.then(function(value) {
  console.log(value); // "成功!"
  throw 'oh, no!';
}).catch(function(e) {
  console.log(e); // "oh, no!"
}).then(function(){
  console.log('after a catch the chain is restored');
}, function () {
  console.log('Not fired due to the catch');
});

// 以下行為與上述相同
p1.then(function(value) {
  console.log(value); // "成功!"
  return Promise.reject('oh, no!');
}).catch(function(e) {
  console.log(e); // "oh, no!"
}).then(function(){
  console.log('after a catch the chain is restored');
}, function () {
  console.log('Not fired due to the catch');
});

使用事務

sequelize的事務處理非常強大伶丐。以下給出一個transaction使用的例子悼做,注意在transaction里面使用的return函數來返回promise的方式,用來保證sequelize執(zhí)行同步哗魂。

sequelize.transaction(function(t) {
    return EventDef.find({where: {id: req.params.id}, transaction: t}).then(function (event) {
      let result = event.dataValues;
      if(result.status === status){
        return sequelize.Promise.reject();
      }
      if(result.owner !== username){
        return sequelize.Promise.reject();
      }
      result.status = status;
      return EventDef.update(result, {where: {id: req.params.id}, transaction: t});
    });
  }).then(function(){
    res.send({success: true});
  }).catch(function (e) {
    console.log(e);
    res.status(500).send(trans.databaseError);
  });

使用關聯關系

Sequelize中使用include hook可以方便的進行表關聯肛走。

let EventDef = require('../model/STREAM_EVENT')(sequelize, Sequelize);
let CEP = require('../model/STREAM_EVENT_CEP')(sequelize, Sequelize);
EventDef.hasOne(CEP, {foreignKey:'event_id', targetKey:'id'});

EventDef.find({
      where:{
        id: req.params.id
      },
      include: {
        model: CEP
      }
    }).then(function(event){
      res.send(event);
    }, function(){
      res.status(500).send(trans.databaseError);
    });

Warning: 一般我們使用sequelize都是在express router里面,注意的是在一個router里面录别,只能有一個response朽色,由于sequelize是異步的,注意是否進行了多次返回组题。

router.put('/:id', function(req, res){
  let event = req.body.event;
  EventDef.find({attributes: ["owner"], where: {id: event.id}}).then((owner)=> {
     res.send({success: true});
  });
  //res.send()葫男,這里不能出現,注意

小結

Sequelize是一個非常優(yōu)秀的ORM工具崔列,了解Promise的運行機制梢褐,注意它的異步性,就能利用好它做數據庫操作了峻呕。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末利职,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子瘦癌,更是在濱河造成了極大的恐慌猪贪,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讯私,死亡現場離奇詭異热押,居然都是意外死亡,警方通過查閱死者的電腦和手機斤寇,發(fā)現死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門桶癣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娘锁,你說我怎么就攤上這事牙寞。” “怎么了间雀?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惹挟。 經常有香客問我,道長连锯,這世上最難降的妖魔是什么归苍? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任拼弃,我火速辦了婚禮,結果婚禮上驳规,老公的妹妹穿的比我還像新娘。我一直安慰自己吗购,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布捻勉。 她就那樣靜靜地躺著,像睡著了一般踱启。 火紅的嫁衣襯著肌膚如雪报账。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天埠偿,我揣著相機與錄音透罢,去河邊找鬼。 笑死冠蒋,一個胖子當著我的面吹牛羽圃,可吹牛的內容都是我干的。 我是一名探鬼主播抖剿,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼朽寞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斩郎?” 一聲冷哼從身側響起脑融,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缩宜,沒想到半個月后肘迎,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年膜宋,在試婚紗的時候發(fā)現自己被綠了窿侈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡秋茫,死狀恐怖,靈堂內的尸體忽然破棺而出乃秀,到底是詐尸還是另有隱情肛著,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布跺讯,位于F島的核電站枢贿,受9級特大地震影響,放射性物質發(fā)生泄漏刀脏。R本人自食惡果不足惜局荚,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愈污。 院中可真熱鬧耀态,春花似錦、人聲如沸暂雹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杭跪。三九已至仙逻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涧尿,已是汗流浹背系奉。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锋玲。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓芥永,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞬内。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容

  • 你不知道JS:異步 第三章:Promises 接上篇3-1 錯誤處理(Error Handling) 在異步編程中...
    purple_force閱讀 1,389評論 0 2
  • 弄懂js異步 講異步之前虫蝶,我們必須掌握一個基礎知識-event-loop能真。 我們知道JavaScript的一大特點...
    DCbryant閱讀 2,706評論 0 5
  • 1. Java基礎部分 基礎部分的順序:基本語法粉铐,類相關的語法,內部類的語法蝙泼,繼承相關的語法,異常的語法汤踏,線程的語...
    子非魚_t_閱讀 31,597評論 18 399
  • 00哗脖、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調函數和事件——更合理和更強大才避。它由社區(qū)...
    夜幕小草閱讀 2,128評論 0 12
  • 或許工扎, 你已經心有所屬。 我們的過去肢娘, 可能只有我一個人記住。 我多么希望我們的故事橱健, 永遠都沒有結局。 無論如何...
    李尚嶸閱讀 175評論 0 4