跳到主要内容

查询运行器

什么是 QueryRunner?

每个新的 QueryRunner 实例都会从连接池中获取一个连接(如果关系数据库管理系统支持连接池)。 对于不支持连接池的数据库,它会在整个数据源中使用相同的连接。

完整的 QueryRunner API 文档请参见迁移章节

创建新的 QueryRunner 实例

使用 createQueryRunner 方法来创建一个新的 QueryRunner

const queryRunner = dataSource.createQueryRunner()

使用 QueryRunner

创建新的 QueryRunner 实例后,当你执行第一个查询时,会从连接池中获取一个连接:

const queryRunner = dataSource.createQueryRunner()
await queryRunner.query("SELECT 1")
await queryRunner.release()

你也可以使用 connect 方法直接从连接池获取一个连接:

const queryRunner = dataSource.createQueryRunner()
const clientConnection = await queryRunner.connect()
await queryRunner.release()

重要:确保在不再需要使用 QueryRunner 时调用释放方法,将连接返回给连接池:

await queryRunner.release()

释放 QueryRunner 后,将无法再使用其方法。

QueryRunner 还有自己独立的 EntityManager 实例,你可以通过 manager 属性使用它,对 QueryRunner 实例所使用的特定数据库连接执行 EntityManager 的查询:

let queryRunner: QueryRunner
try {
queryRunner = dataSource.createQueryRunner()
// 使用单个数据库连接执行多个查询
await queryRunner.manager.update(
Employee,
{ level: "junior" },
{ bonus: 0.2 },
)
await queryRunner.manager.update(
Employee,
{ level: "senior" },
{ bonus: 0.1 },
)
} catch (error) {
console.error(error)
} finally {
// 使用完成后记得释放连接
await queryRunner.release()
}

显式资源管理

QueryRunner 也支持显式的资源管理:

async function updateSalaries() {
await using queryRunner = dataSource.createQueryRunner()
await queryRunner.manager.update(
Employee,
{ level: "junior" },
{ bonus: 0.2 },
)
await queryRunner.manager.update(
Employee,
{ level: "senior" },
{ bonus: 0.1 },
)
// 不再需要手动释放 QueryRunner
}

try {
await updateSalaries()
} catch (error) {
console.error(error)
}

像这样声明 query runner 时,它会在包含作用域中的最后一条语句执行完毕后自动释放。