📜  raw: true in sequelize - Javascript (1)

📅  最后修改于: 2023-12-03 15:04:47.896000             🧑  作者: Mango

Sequelize 中的 raw: true

在使用 Sequelize 连接数据库时,有时需要执行各种 SQL 查询操作。 Sequelize 的 query 方法可以直接执行 SQL 语句,但它返回的结果是一个对象数组,不方便使用。此时可以使用 raw: true 选项,以便返回原始的查询结果。

什么是 raw: true

raw: true 是 Sequelize 中一个查询操作的选项。它的作用是告诉 Sequelize 返回原始的查询结果,而不是 Sequelize 对象。原始查询结果是一个数组,其中每个元素是一个对象,代表一行查询结果。

下面是一个使用 raw: true 的示例:

const users = await User.findAll({
  attributes: ['id', 'username'],
  where: {
    status: 'active'
  },
  raw: true
});

此查询将从名为 users 的表中选择 idusername 字段,在满足 status = 'active' 条件的行中执行查询,并返回原始查询结果。没有使用 raw: true 选项时,返回的是 Sequelize 对象数组。

raw: true 的优缺点

使用 raw: true 的优点是返回的查询结果是一个对象数组,不需要再使用 Sequelize 对象包装,更容易使用。另外,原始查询结果中的每个元素都是一个对象,包含了所有查询结果的字段,不需要再通过 Sequelize 对象获取。这也比使用 Sequelize 对象的方式更高效。

缺点是原始查询结果缺少了 Sequelize 对象的一些特性,比如 validataion 和 hooks。而且原始查询结果中的字段名与数据库中定义的字段名相同,对查询结果的理解需要更深的数据库知识和经验。

总之,使用 raw: true 取决于查询的需要和个人经验,需要对查询结果进行一定的解释和理解。

示例
const Sequelize = require('sequelize');
const sequelize = new Sequelize('mysql://root:123456@localhost/mydb');

const User = sequelize.define('user', {
  id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true },
  username: Sequelize.STRING,
  password: Sequelize.STRING,
  status: Sequelize.ENUM('active', 'inactive')
});

(async () => {
  await sequelize.sync({ force: true });

  await User.bulkCreate([
    { username: 'Alice', password: '123', status: 'active' },
    { username: 'Bob', password: '456', status: 'inactive' },
    { username: 'Cathy', password: '789', status: 'active' }
  ]);

  const users = await User.findAll({
    attributes: ['id', 'username'],
    where: { status: 'active' },
    raw: true
  });

  console.log(users);
})();

返回的结果如下:

[ 
  { id: 1, username: 'Alice' },
  { id: 3, username: 'Cathy' } 
]
参考