數(shù)據(jù)庫復(fù)習(xí)(sequelize復(fù)習(xí))

以下文檔摘要自sequelize中文文檔

數(shù)據(jù)庫連接

const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: /* 選擇 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
});

表創(chuàng)建連接

sequelize中沒有表的概念逝慧,這里更多是說modal,故我們的項目一般分為modal、service逼泣、controller三層诅病。

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

const User = sequelize.define('User', {
  // 在這里定義模型屬性
  firstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  lastName: {
    type: DataTypes.STRING
    // allowNull 默認(rèn)為 true
  }
}, {
  // 這是其他模型參數(shù)
});

模型同步這里需要了解一下,通過User.sync()來做对扶。

數(shù)據(jù)庫操作語句

這里需要提的是sequelize的所有操作都是基于modal實例上來進(jìn)行的袁辈,實例通過User.build來進(jìn)行創(chuàng)建菜谣,保存通過實例的save方法進(jìn)行。
常用語句如下

  • insert: User.create(創(chuàng)建對象)
  • delete: User.drop(條件語句)
  • update: User.update(修改對象晚缩,條件語句)
  • select: User.findAll()

select

查詢這里的語法和特殊點較多,語法有:

  • findAll
  • findOne
  • findByPk
  • findOrCreate
  • findAndCountAll

特殊點有

  • 表字段處理
  • where
  • order by
  • limit媳危、offset
  • group by

表字段處理

User.findAll({
  attributes: [
    'foo',  // 特定字段查詢
    ['bar', 'baz'],  // 將字段bar重命名為baz
    [sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats'] // 聚合count
  ]
})

where

const { Op } = require("sequelize");
Post.findAll({
  where: {
    [Op.and]: [{ a: 5 }, { b: 6 }],            // (a = 5) AND (b = 6)
    [Op.or]: [{ a: 5 }, { b: 6 }],             // (a = 5) OR (b = 6)
    someAttribute: {
      // 基本
      [Op.eq]: 3,                              // = 3
      [Op.ne]: 20,                             // != 20
      [Op.is]: null,                           // IS NULL
      [Op.not]: true,                          // IS NOT TRUE
      [Op.or]: [5, 6],                         // (someAttribute = 5) OR (someAttribute = 6)

      // 使用方言特定的列標(biāo)識符 (以下示例中使用 PG):
      [Op.col]: 'user.organization_id',        // = "user"."organization_id"

      // 數(shù)字比較
      [Op.gt]: 6,                              // > 6
      [Op.gte]: 6,                             // >= 6
      [Op.lt]: 10,                             // < 10
      [Op.lte]: 10,                            // <= 10
      [Op.between]: [6, 10],                   // BETWEEN 6 AND 10
      [Op.notBetween]: [11, 15],               // NOT BETWEEN 11 AND 15

      // 其它操作符

      [Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1)

      [Op.in]: [1, 2],                         // IN [1, 2]
      [Op.notIn]: [1, 2],                      // NOT IN [1, 2]

      [Op.like]: '%hat',                       // LIKE '%hat'
      [Op.notLike]: '%hat',                    // NOT LIKE '%hat'
      [Op.startsWith]: 'hat',                  // LIKE 'hat%'
      [Op.endsWith]: 'hat',                    // LIKE '%hat'
      [Op.substring]: 'hat',                   // LIKE '%hat%'
      [Op.iLike]: '%hat',                      // ILIKE '%hat' (不區(qū)分大小寫) (僅 PG)
      [Op.notILike]: '%hat',                   // NOT ILIKE '%hat'  (僅 PG)
      [Op.regexp]: '^[h|a|t]',                 // REGEXP/~ '^[h|a|t]' (僅 MySQL/PG)
      [Op.notRegexp]: '^[h|a|t]',              // NOT REGEXP/!~ '^[h|a|t]' (僅 MySQL/PG)
      [Op.iRegexp]: '^[h|a|t]',                // ~* '^[h|a|t]' (僅 PG)
      [Op.notIRegexp]: '^[h|a|t]',             // !~* '^[h|a|t]' (僅 PG)

      [Op.any]: [2, 3],                        // ANY ARRAY[2, 3]::INTEGER (僅 PG)

      // 在 Postgres 中, Op.like/Op.iLike/Op.notLike 可以結(jié)合 Op.any 使用:
      [Op.like]: { [Op.any]: ['cat', 'hat'] }  // LIKE ANY ARRAY['cat', 'hat']

      // 還有更多的僅限 postgres 的范圍運(yùn)算符,請參見下文
    }
  }
});

order by

Foo.findOne({
  order: [
    // 將返回 `name`
    ['name'],
    // 將返回 `username` DESC
    ['username', 'DESC'],
    // 將返回 max(`age`)
    sequelize.fn('max', sequelize.col('age')),
    // 將返回 max(`age`) DESC
    [sequelize.fn('max', sequelize.col('age')), 'DESC'],
    // 將返回 otherfunction(`col1`, 12, 'lalala') DESC
    [sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
    // 將返回 otherfunction(awesomefunction(`col`)) DESC, 這種嵌套可能是無限的!
    [sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC']
  ]
});

limit荞彼、offset

Project.findAll({ offset: 5, limit: 5 });

group by

Project.findAll({ group: 'name' });

連表查詢

建立表關(guān)系語法:hasOne、hasMany待笑、belongsTo鸣皂、belongsToMany
建立后,可以通過get${指定鍵}獲取暮蹂,參考關(guān)聯(lián)

延遲獲取

const awesomeCaptain = await Captain.findOne({
  where: {
    name: "Jack Sparrow"
  }
});
// 用獲取到的 captain 做點什么
console.log('Name:', awesomeCaptain.name);
console.log('Skill Level:', awesomeCaptain.skillLevel);
// 現(xiàn)在我們需要有關(guān)他的 ship 的信息!
const hisShip = await awesomeCaptain.getShip();
// 用 ship 做點什么
console.log('Ship Name:', hisShip.name);
console.log('Amount of Sails:', hisShip.amountOfSails);

預(yù)先加載

const awesomeCaptain = await Captain.findOne({
  where: {
    name: "Jack Sparrow"
  },
  include: Ship
});
// 現(xiàn)在 ship 跟著一起來了
console.log('Name:', awesomeCaptain.name);
console.log('Skill Level:', awesomeCaptain.skillLevel);
console.log('Ship Name:', awesomeCaptain.ship.name);
console.log('Amount of Sails:', awesomeCaptain.ship.amountOfSails);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寞缝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仰泻,更是在濱河造成了極大的恐慌荆陆,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件集侯,死亡現(xiàn)場離奇詭異被啼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)棠枉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門浓体,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辈讶,你說我怎么就攤上這事命浴。” “怎么了贱除?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵生闲,是天一觀的道長。 經(jīng)常有香客問我勘伺,道長跪腹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任飞醉,我火速辦了婚禮冲茸,結(jié)果婚禮上屯阀,老公的妹妹穿的比我還像新娘。我一直安慰自己轴术,他們只是感情好难衰,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逗栽,像睡著了一般盖袭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彼宠,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天鳄虱,我揣著相機(jī)與錄音,去河邊找鬼凭峡。 笑死拙已,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摧冀。 我是一名探鬼主播倍踪,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼索昂!你這毒婦竟也來了建车?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤椒惨,失蹤者是張志新(化名)和其女友劉穎缤至,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體框产,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡凄杯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秉宿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戒突。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖描睦,靈堂內(nèi)的尸體忽然破棺而出膊存,到底是詐尸還是另有隱情,我是刑警寧澤忱叭,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布隔崎,位于F島的核電站,受9級特大地震影響韵丑,放射性物質(zhì)發(fā)生泄漏爵卒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一撵彻、第九天 我趴在偏房一處隱蔽的房頂上張望钓株。 院中可真熱鬧实牡,春花似錦、人聲如沸轴合。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽受葛。三九已至题涨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間总滩,已是汗流浹背纲堵。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留咳秉,地道東北人婉支。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像澜建,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蝌以,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容