掘金日新计划&Sequelize知识合集三

82 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天

一、 模型查询

Sequelize 提供了多种方法来协助查询数据库中的数据.

1.1 INSERT 查询

首先,一个简单的例子:

// 创建一个新用户
const jane = await User.create({ firstName: "Jane", lastName: "Doe" });
console.log("Jane's auto-generated ID:", jane.id);

Model.create()方法是使用 Model.build()构建未保存实例并使用  instance.save()是保存实例的简写形式.

也可以定义在 create 方法中的属性. 如果你基于用户填写的表单创建数据库条目,这将特别有用. 例如,使用它可以允许你将 User 模型限制为仅设置用户名和地址,而不设置管理员标志 (例如, isAdmin):

const user = await User.create({
  username: 'alice123',
  isAdmin: true
}, { fields: ['username'] });
// 假设 isAdmin 的默认值为 false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false

1.2 SELECT 查询

你可以使用 findAll方法从数据库中读取整个表:

// 查询所有用户
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));

1.3 WHERE 子句

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

Post.findAll({
  where: {
    authorId: 2
  }
});
// SELECT * FROM post WHERE authorId = 2;

可以看到没有显式传递任何运算符(来自Op),因为默认情况下 Sequelize 假定进行相等比较. 上面的代码等效于:

const { Op } = require("sequelize");
Post.findAll({
  where: {
    authorId: {
      [Op.eq]: 2
    }
  }
});
// SELECT * FROM post WHERE authorId = 2;

可以传递多个校验:

Post.findAll({
  where: {
    authorId: 12,
    status: 'active'
  }
});
// SELECT * FROM post WHERE authorId = 12 AND status = 'active';

1.4 UPDATE 查询

Update 查询也接受 where 参数,就像上面的读取查询一样.

// 将所有没有姓氏的人更改为 "Doe"
await User.update({ lastName: "Doe" }, {
  where: {
    lastName: null
  }
});

1.5 DELETE 查询

Delete 查询也接受 where 参数,就像上面的读取查询一样.

// 删除所有名为 "Jane" 的人 
await User.destroy({
  where: {
    firstName: "Jane"
  }
});

要销毁所有内容,可以使用 TRUNCATE SQL:

// 截断表格
await User.destroy({
  truncate: true
});

二、 一些注意事项

1、Finder 方法是生成 SELECT 查询的方法.

默认情况下,所有 finder 方法的结果都是模型类的实例(与普通的 JavaScript 对象相反). 这意味着在数据库返回结果之后,Sequelize 会自动将所有内容包装在适当的实例对象中. 在少数情况下,当结果太多时,这种包装可能会效率低下. 要禁用此包装并收到简单的响应,请将 { raw: true } 作为参数传递给 finder 方法.

2、findAll 方法. 它生成一个标准的 SELECT 查询,该查询将从表中检索所有条目(除非受到 where 子句的限制).

3、findByPk 方法使用提供的主键从表中仅获得一个条目.

4、findOne 方法获得它找到的第一个条目(它可以满足提供的可选查询参数).

5、除非找到一个满足查询参数的结果,否则方法 findOrCreate 将在表中创建一个条目. 在这两种情况下,它将返回一个实例(找到的实例或创建的实例)和一个布尔值,指示该实例是已创建还是已经存在.

6、findAndCountAll 方法是结合了 findAll 和 count 的便捷方法. 在处理与分页有关的查询时非常有用.

烟火向星辰,所愿皆成真!