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,
]);