乐闻世界logo
搜索文章和话题

How to excute Raw SQL Query on NestJS framework using typeorm

4 个月前提问
3 个月前修改
浏览次数119

1个答案

1

typeorm 中执行原始 SQL 查询是一个直接而有效的操作,你可以通过几种不同的方法来完成。以下是一些例子和步骤说明:

使用 EntityManager 执行原始 SQL

EntityManager 类提供了执行 SQL 语句的方法。下面展示了如何使用它:

  1. 获取 EntityManager 实例 - 你可以通过 getConnection 方法获取到当前连接的 EntityManager

    typescript
    import { getConnection } from 'typeorm'; const entityManager = getConnection().manager;
  2. 执行原始 SQL 查询 - 使用 query 方法执行原始 SQL 查询。

    typescript
    // 执行一个简单的 SELECT 查询 const rawData = await entityManager.query(`SELECT * FROM users WHERE id = $1`, [1]);

    在这个例子中,我们使用了参数化查询,$1 是第一个参数的占位符,然后在数组中传递实际的值,这有助于预防 SQL 注入攻击。

使用 QueryRunner 执行原始 SQL

QueryRunner 类也可以用于执行原始 SQL,这通常用在事务管理中。以下是如何使用它:

  1. 创建 QueryRunner 实例 - 从连接中获取 QueryRunner

    typescript
    import { getConnection } from 'typeorm'; const queryRunner = getConnection().createQueryRunner();
  2. 使用 QueryRunner 执行查询

    typescript
    // 首先连接到数据库 await queryRunner.connect(); try { // 然后执行查询 const rawData = await queryRunner.query(`SELECT * FROM users`); } finally { // 释放连接 await queryRunner.release(); }

使用 Repository 执行原始 SQL

虽然仓库(Repository)通常用于ORM操作,但它也支持执行原始 SQL。

  1. 获取 Repository 实例

    typescript
    import { getRepository } from 'typeorm'; import { User } from './entity/User'; const userRepository = getRepository(User);
  2. 使用 Repository 执行原始 SQL

    typescript
    const rawData = await userRepository.query(`SELECT * FROM users WHERE name = $1`, ['John']);

注意事项

  • 在执行原始 SQL 查询时,务必要注意 SQL 注入的风险。在上述例子中,我展示了如何使用参数化查询,这是防止 SQL 注入的一种重要方式。
  • 当你在使用事务时,确保正确地管理连接和事务的生命周期,包括在出错时回滚事务以及最终释放连接。
  • typeorm 支持多种数据库,不同数据库的 SQL 可能有所不同,确保你的 SQL 查询与所使用的数据库是兼容的。

这些就是使用 typeorm 执行原始 SQL 查询的主要方式。在实际应用中,通常推荐尽可能使用 TypeORM 提供的方法来利用 ORM 的优势,只在特殊情况下使用原始 SQL。

2024年6月29日 12:07 回复

你的答案