Multiple data sources, databases, schemas and replication setup

Using multiple data sources

To use multiple data sources connected to different databases, simply create multiple DataSource instances:

import { DataSource } from "typeorm"

const db1DataSource = new DataSource({
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "admin",
    database: "db1",
    entities: [__dirname + "/entities/*{.js,.ts}"],
    synchronize: true,
})

const db2DataSource = new DataSource({
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "admin",
    database: "db2",
    entities: [__dirname + "/entities/*{.js,.ts}"],
    synchronize: true,
})

Using multiple databases within a single data source

To use multiple databases in a single data source, you can specify database name per-entity:

User entity will be created inside secondDB database and Photo entity inside thirdDB database. All other entities will be created in a default database defined in the data source options.

If you want to select data from a different database you only need to provide an entity:

This code will produce following SQL query (depend on database type):

You can also specify a table path instead of the entity:

This feature is supported only in mysql and mssql databases.

Using multiple schemas within a single data source

To use multiple schemas in your applications, just set schema on each entity:

User entity will be created inside secondSchema schema and Photo entity inside thirdSchema schema. All other entities will be created in a default database defined in the data source options.

If you want to select data from a different schema you only need to provide an entity:

This code will produce following SQL query (depend on database type):

You can also specify a table path instead of entity:

This feature is supported only in postgres and mssql databases. In mssql you can also combine schemas and databases, for example:

Replication

You can set up read/write replication using TypeORM. Example of replication options:

With replication slaves defined, TypeORM will start sending all possible queries to slaves by default.

  • all queries performed by the find methods or SelectQueryBuilder will use a random slave instance

  • all write queries performed by update, create, InsertQueryBuilder, UpdateQueryBuilder, etc will use the master instance

  • all raw queries performed by calling .query() will use the master instance

  • all schema update operations are performed using the master instance

Explicitly selecting query destinations

By default, TypeORM will send all read queries to a random read slave, and all writes to the master. This means when you first add the replication settings to your configuration, any existing read query runners that don't explicitly specify a replication mode will start going to a slave. This is good for scalability, but if some of those queries must return up to date data, then you need to explicitly pass a replication mode when you create a query runner.

If you want to explicitly use the master for read queries, pass an explicit ReplicationMode when creating your QueryRunner;

If you want to use a slave in raw queries, pass slave as the replication mode when creating a query runner:

Note: Manually created QueryRunner instances must be explicitly released on their own. If you don't release your query runners, they will keep a connection checked out of the pool, and prevent other queries from using it.

Adjusting the default destination for reads

If you don't want all reads to go to a slave instance by default, you can change the default read query destination by passing defaultMode: "master" in your replication options:

With this mode, no queries will go to the read slaves by default, and you'll have to opt-in to sending queries to read slaves with explicit .createQueryRunner("slave") calls.

If you're adding replication options to an existing app for the first time, this is a good option for ensuring no behavior changes right away, and instead you can slowly adopt read replicas on a query runner by query runner basis.

Supported drivers

Replication is supported by the MySQL, PostgreSQL, SQL Server, Cockroach, Oracle, and Spanner connection drivers.

MySQL replication supports extra configuration options:

Last updated