Skip to content

SQL 方案:原始 SQL

在 NestJS 中执行原始 SQL 是处理复杂查询、批量操作或需要绕过 ORM 抽象层的常用场景。

传参

ts
// 在 mysql 数据库中传参,使用 ?占位,参数为 [id],此法可防止 sql 注入
await this.userRepository.query('SELECT * FROM user where id = ? AND deletedAt IS NULL', [id]);

插入(Insert)

ts
// 新增单条
await this.rolesRepository.query('INSERT INTO roles (rolename) VALUES (?)', [roles.rolename]);

// 新增多条
for (const roleId of roleIds) {
  await this.rolesRepository.query('INSERT INTO users_roles (user_id,role_id) VALUES (?,?)', [
    userId,
    roleId,
  ]);
}

删除(Delete)

ts
// 永久删除
await this.userRepository.query('DELETE FROM user where id = ?', [id]);

// 软删除
await this.userRepository.query('UPDATE user SET deletedAt = NOW() WHERE id = ?', [id]);

// 恢复软删除
await this.userRepository.query('UPDATE user SET deletedAt = null WHERE id = ?', [id]);

更新(Update)

ts
// 修改
await this.userRepository.query('UPDATE user SET username = ?,password = ? WHERE id = ?', [
  user.username,
  user.password,
  user.id,
]);

查询(Select)

ts
// 查询(排除软删除的数据)
await this.userRepository.query('SELECT * FROM user where id = ? AND deletedAt IS NULL', [id]);

// 分页查询
await this.logRepository.query('SELECT * FROM log where user_id = ? LIMIT ? OFFSET ?', [
  userId,
  Number(pages),
  (currentPage - 1) * pages,
]);