Working with Query Runner
What is QueryRunner
Your interaction with the database is only possible once you setup a connection.
TypeORM's Connection does not setup a database connection as it might seem, instead it sets up a connection pool.
If you are interested in a real database connection, you should use QueryRunner.
Each instance of QueryRunner is a separate isolated database connection. Using query runners you can control your queries to execute using single database connection and manually control your database transaction.
Creating a new queryRunner
To create a new instance of QueryRunner you should first create a connection pool, in any of the ways described on the Connection documentation. Once a connection has established, use the createQueryRunner function to create an isolated connection.
createQueryRunner Creates a query runner used to perform queries on a single database connection.
import { getConnection, QueryRunner } from 'typeorm';
// can be used once createConnection is called and is resolved
const connection: Connection = getConnection();
const queryRunner: QueryRunner = connection.createQueryRunner();
Using queryRunner
After creating an instance of QueryRunner use connect to activate the connection.
import { getConnection, QueryRunner } from 'typeorm';
// can be used once createConnection is called and is resolved
const connection: Connection = getConnection();
const queryRunner: QueryRunner = connection.createQueryRunner();
await queryRunner.connect(); // performs connection
Since the QueryRunner is used to manage an isolated database connection, make sure to release it when it is not needed anymore to make it available to the connection pool again. After connection is released it is not possible to use the query runner methods.
Working with QueryRunner
Once you set your queryRunner up, you can use it with an interface similar to the Connection interface:
import { getConnection, QueryRunner } from 'typeorm';
import { User } from "../entity/User";
export class UserController {
@Get("/users")
getAll(): Promise<User[]> {
// can be used once createConnection is called and is resolved
const connection: Connection = getConnection();
const queryRunner: QueryRunner = connection.createQueryRunner();
await queryRunner.connect(); // performs connection
const users = await queryRunner.manager.find(User);
await queryRunner.release(); // release connection
return users;
}
}