Перейти к основному содержанию

Query Runner

Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

Что такое QueryRunner?

Каждый новый экземпляр QueryRunner занимает одно соединение из пула соединений, если используемая СУБД поддерживает такую возможность. Для баз данных без поддержки пулов соединений используется единое соединение для всего источника данных.

Полное описание QueryRunner API доступно в разделе миграций.

Создание нового экземпляра QueryRunner

Для создания нового QueryRunner используйте метод createQueryRunner:

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, который позволяет выполнять запросы EntityManager через конкретное подключение к БД, используемое данным экземпляром QueryRunner:

let queryRunner: QueryRunner
try {
queryRunner = dataSource.createQueryRunner()
// use a single database connection to execute multiple queries
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 {
// remember to release connection after you are done using it
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 },
)
// no need anymore to manually release the QueryRunner
}

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

При таком объявлении query runner будет автоматически освобождён после выполнения последней инструкции в охватывающей области видимости.