Sequelize | 6. 模型 - 查詢數(shù)據(jù)

模型

const { Sequelize, Model, DataTypes } = require('sequelize');

const sequelize = new Sequelize('db_stu', 'db_username', 'db_password', {
  host: '127.0.0.1',
  dialect: 'mysql',
  pool: {
    max: 50,
    min: 0,
    idle: 5000
  }
});

class UserModel extends Model { }

UserModel.init({
  firstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  lastName: {
    type: DataTypes.STRING,
    allowNull: true
  },
  birthday: {
    type: DataTypes.DATEONLY,
    allowNull: true
  },
  sex: {
    type: DataTypes.ENUM('male', 'female'),
    allowNull: true
  },
  teacherId: {
    type: Sequelize.INTEGER,
    references: {
      model: 't_teachers',
      key: 'id'
    }
  },
  Enable: {
    type: DataTypes.BOOLEAN,
    allowNull: true
  }
}, {
  sequelize,
  modelName: 't_users',
  freezeTableName: true,
  timestamps: false
});

findAll()方法

  • findAll方法的基礎用法
    相當于SELECT * FROM t_users;
(async () => {
  let users = await UserModel.findAll();
  console.log(JSON.stringify(users, null, 2));
})();
  • findAll方法中茵典,帶attributes參數(shù)的用法

attributes參數(shù)的基礎用法
相當于SELECT id, first_name, last_name FROM t_users;

(async () => {
  let users_less = await UserModel.findAll({
    attributes: ['id', 'first_name', 'last_name']
  })
  console.log(JSON.stringify(users_less, null, 2));
})();

attributes參數(shù)中使用sequelize.fn + sequelize.col方法來聚合數(shù)據(jù)
相當于SELECT first_name, COUNT(first_name) AS total FROM t_users;

(async () => {
  let users_count = await UserModel.findAll({
    attributes: [
      'first_name',
      [sequelize.fn('COUNT', sequelize.col('first_name')), 'total']
    ]
  })
  console.log(JSON.stringify(users_count, null, 2));
})();

attributes參數(shù)中,使用exclude來排除某個字段已脓,使用include來添加字段到末尾
相當于SELECT first_name, last_name, birthday, sex, teacher_id, enable, COUNT(first_name) AS total FROM t_users;

(async () => {
  let users_count = await UserModel.findAll({
    attributes: {
      exclude: ['id'],
      include: [
        [sequelize.fn('COUNT', sequelize.col('first_name')), 'total']
      ]
    }
  })
  console.log(JSON.stringify(users_count, null, 2));
})();

findAll方法中垄惧,帶where參數(shù)的用法

基礎where查詢
相當于SELECT * FROM t_users WHERE first_name = 'Guangming';

(async () => {
  let users_where = await UserModel.findAll({
    where: {
      first_name: 'Guangming'
    }
  });
  console.log(JSON.stringify(users_where, null, 2));
})();

邏輯運算符Op缝驳,與上面用法效果一致慈俯。

const { Op } = require('sequelize');

(async () => {
  let users_or = await UserModel.findAll({
    where: {
      id: {
        [Op.eq]: 2
      }
    }
  })
  console.log(JSON.stringify(users_or, null, 2));
})()

where和and組合查詢
相當于SELECT * FROM t_users WHERE first_name = 'Guangming' and last_name = 'Lee';

(async() => {
  let user_and = await UserModel.findAll({
    where: {
      first_name: 'Guangming',
      last_name: 'Lee'
    }
  });
  console.log(JSON.stringify(user_and, null, 2));
})();

邏輯運算符Op栏尚,與上面用法效果一致起愈。

(async () => {
  let users_and = await UserModel.findAll({
    where: {
      [Op.and]: [
        { first_name: 'Guangming' },
        { last_name: 'Lee' }
      ]
    }
  })
  console.log(JSON.stringify(users_and, null, 2));
})();

where和or組合查詢
相當于SELECT * FROM t_users WHERE id = 2 OR id = 3;

(async () => {
  let user_or = await UserModel.findAll({
    where: {
      [Op.or]: [
        { id: 2 },
        { id: 3 }
      ]
    }
  });
  console.log(JSON.stringify(user_or, null, 2));
})();

where和in組合查詢
相當于SELECT * FROM t_users WHERE id IN (2,3);

(async () => {
  let user_in = await UserModel.findAll({
    where: {
      id: [2, 3]
    }
  });
  console.log(JSON.stringify(user_in, null, 2));
})();

where和like組合查詢
相當于SELECT * FROM t_users WHERE first_name LIKE '%min%';

(async () => {
  let user_like = await UserModel.findAll({
    where: {
      first_name : {
        [Op.like] : '%min%'
      }
    }
  });
  console.log(JSON.stringify(user_like, null, 2));
})();

其他條件組合查詢

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)

      // 使用方言特定的列標識符 (以下示例中使用 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 可以結合 Op.any 使用:
      [Op.like]: { [Op.any]: ['cat', 'hat'] }  // LIKE ANY ARRAY['cat', 'hat']

      // 還有更多的僅限 postgres 的范圍運算符,請參見下文
    }
  }
});
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市译仗,隨后出現(xiàn)的幾起案子抬虽,更是在濱河造成了極大的恐慌,老刑警劉巖纵菌,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阐污,死亡現(xiàn)場離奇詭異,居然都是意外死亡咱圆,警方通過查閱死者的電腦和手機笛辟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來序苏,“玉大人手幢,你說我怎么就攤上這事〕老辏” “怎么了围来?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我监透,道長桶错,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任胀蛮,我火速辦了婚禮院刁,結果婚禮上,老公的妹妹穿的比我還像新娘粪狼。我一直安慰自己黎比,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布鸳玩。 她就那樣靜靜地躺著阅虫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪不跟。 梳的紋絲不亂的頭發(fā)上颓帝,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音窝革,去河邊找鬼购城。 笑死,一個胖子當著我的面吹牛虐译,可吹牛的內容都是我干的瘪板。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼漆诽,長吁一口氣:“原來是場噩夢啊……” “哼侮攀!你這毒婦竟也來了?” 一聲冷哼從身側響起厢拭,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兰英,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后供鸠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畦贸,經...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年楞捂,在試婚紗的時候發(fā)現(xiàn)自己被綠了薄坏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡寨闹,死狀恐怖胶坠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鼻忠,我是刑警寧澤涵但,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站帖蔓,受9級特大地震影響矮瘟,放射性物質發(fā)生泄漏。R本人自食惡果不足惜塑娇,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一澈侠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧埋酬,春花似錦哨啃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至珍特,卻和暖如春祝峻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扎筒。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工莱找, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗜桌。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓奥溺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骨宠。 傳聞我的和親對象是個殘疾皇子浮定,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容