NodeJS的sequelize的原始查询用法

717 阅读2分钟

这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

1.原始查询

为了执行原始的SQL查询,因此可以使用 sequelize.query 方法.

默认情况下,函数将返回两个参数 - 一个结果数组,以及一个包含元数据(例如受影响的行数等)的对象返回元数据 "within" 结果对象(作为数组上的属性),但是会永远返回两个参数,但对于MSSQL和MySQL,它将是对同一对象的两个引用.

const [results, metadata] = await sequelize.query("UPDATE users SET y = 12 WHERE x = 12");
// 结果将是一个空数组,元数据将包含受影响的行数.

在不需要访问元数据的情况下,传递一个查询类型格式化结果

const { QueryTypes } = require('sequelize');
const users = await sequelize.query("SELECT * FROM `users`", { type: QueryTypes.SELECT });

第二种选择是模型. 如果传递模型,返回的数据将是该模型的实例

const projects = await sequelize.query('SELECT * FROM projects', {
  model: Projects,
  mapToModel: true // 如果你有任何映射字段,则在此处传递 true
});
// 现在`projects` 的每个元素都是 Project 的一个实例

2.替换

查询中的替换可以通过两种不同的方式完成,使用命名参数(以:开头),或者由表示的未命名参数,并在options对象中传递

  • 如果传递一个数组, ? 将按照它们在数组中出现的顺序被替换
  • 如果传递一个对象, :key 将替换为该对象的键. 如果对象包含在查询中找不到的键,则会抛出异常,反之亦然.
const { QueryTypes } = require('sequelize');

await sequelize.query(
  'SELECT * FROM projects WHERE status = ?',
  {
    replacements: ['active'],
    type: QueryTypes.SELECT
  }
);

3.绑定参数

绑定参数由 $1, $2, ... (numeric) 或 $key (alpha-numeric) 引用

  • 如果传递一个数组, $1 被绑定到数组中的第一个元素 (bind[0])
  • 如果传递一个对象, $key 绑定到 object['key']. 每个键必须以非数字字符开始. $1 不是一个有效的键,即使 object['1'] 存在
  • 在这两种情况下 $$ 可以用来转义一个 $ 字符符号

数组或对象必须包含所有绑定的值,或者Sequelize将抛出异常. 这甚至适用于数据库可能忽略绑定参数的情况.

绑定参数不能是SQL关键字,也不能是表或列名. 引用的文本或数据也忽略它们

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

await sequelize.query(
  'SELECT *, "text with literal $$1 and literal $$status" as t FROM projects WHERE status = $1',
  {
    bind: ['active'],
    type: QueryTypes.SELECT
  }
);