在 typeorm
中执行原始 SQL 查询是一个直接而有效的操作,你可以通过几种不同的方法来完成。以下是一些例子和步骤说明:
使用 EntityManager
执行原始 SQL
EntityManager
类提供了执行 SQL 语句的方法。下面展示了如何使用它:
-
获取
EntityManager
实例 - 你可以通过getConnection
方法获取到当前连接的EntityManager
。typescriptimport { getConnection } from 'typeorm'; const entityManager = getConnection().manager;
-
执行原始 SQL 查询 - 使用
query
方法执行原始 SQL 查询。typescript// 执行一个简单的 SELECT 查询 const rawData = await entityManager.query(`SELECT * FROM users WHERE id = $1`, [1]);
在这个例子中,我们使用了参数化查询,
$1
是第一个参数的占位符,然后在数组中传递实际的值,这有助于预防 SQL 注入攻击。
使用 QueryRunner
执行原始 SQL
QueryRunner
类也可以用于执行原始 SQL,这通常用在事务管理中。以下是如何使用它:
-
创建
QueryRunner
实例 - 从连接中获取QueryRunner
。typescriptimport { getConnection } from 'typeorm'; const queryRunner = getConnection().createQueryRunner();
-
使用
QueryRunner
执行查询typescript// 首先连接到数据库 await queryRunner.connect(); try { // 然后执行查询 const rawData = await queryRunner.query(`SELECT * FROM users`); } finally { // 释放连接 await queryRunner.release(); }
使用 Repository
执行原始 SQL
虽然仓库(Repository)通常用于ORM操作,但它也支持执行原始 SQL。
-
获取
Repository
实例typescriptimport { getRepository } from 'typeorm'; import { User } from './entity/User'; const userRepository = getRepository(User);
-
使用
Repository
执行原始 SQLtypescriptconst 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 回复