NodeJS的sequelize操作数据库(四)

172 阅读2分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

一. Sequelize 应用 WHERE 子句

where 参数用于过滤查询.where 子句有很多运算符,可以从中以 Symbols 的形式使用.

User.findAll({
  where: {
    name: '李华'
  }
});
// SELECT * FROM user WHERE name = '李华'

sequelize.Op可以进行相等比较值

const { Op } = require("sequelize");
User.findAll({
  where: {
    name: {
      [Op.eq]:'李华'
    }
  }
});
// SELECT * FROM user WHERE name = '李华'

也可以传递多个校验值:

User.findAll({
  where: {
    age: 18
    name: '李华'
  }
});
// SELECT * FROM user WHERE age = 18 AND name = '李华';

这里用Op.and也是对等Op.eq

**const { Op } = require("sequelize");
User.findAll({
  where: {
    [Op.and]: [
      { age: 18 },
      { name: '李华' }
    ]
  }
});
// SELECT * FROM user WHERE age = 18 AND name = '李华';

OR 可以通过类似的方式执行:

const { Op } = require("sequelize");
User.findAll({
  where: {
    [Op.or]: [
      { age: 18 },
      { age: 30 }
    ]
  }
});
// SELECT * FROM user WHERE age = 18 OR age = 30;

 OR 涉及相同字段 ,因此 Sequelize 可以使用数组的形式作为参数值

const { Op } = require("sequelize");
User.destroy({
  where: {
    age: {
      [Op.or]: [12, 13]
    }
  }
});
// DELETE FROM user WHERE age = 12 OR age = 13;

二. Sequelize 提供了多种运算符.

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"

      // 数字比较
      [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' (不区分大小写) (仅 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)
      [Op.match]: Sequelize.fn('to_tsquery', 'fat & rat') // 匹配文本搜索字符串 'fat' 和 'rat' (仅 PG)

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

      // 还有更多的仅限 postgres 的范围运算符,请参见下文
    }
  }
});

Op.in 的简写语法, 直接将数组参数传递给 where 使用 IN 运算符:

User.findAll({
  where: {
    age: [18,19,40] // 等同使用 `age: { [Op.in]: [18,19,40] }`
  }
});
// SELECT ... FROM "user" AS "user" WHERE "user"."age" IN (18,19,40);