Open6

【TypeORM】データベースの分割に伴うTypeORMによる接続の扱い方を調査メモ

がくがく

ormconfig.jsの設定

ormconfig.jsにConnectionOptionsをimportして、設定を配列にすることで複数のDB設定を書ける。
entities, migration, seedsは既存とは別ディレクトリ用意する必要があるかも。

import { ConnectionOptions } from "typeorm";
const ormconfig: ConnectionOptions[] = [
{
    type: "mysql",
    host: process.env.DB_HOST,
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE,
    synchronize: true,
    entities: ["src/entities/**/*.ts"],
    migrations: ["src/db/migrations/**/*.ts"],
},
{
    name: "db2", // 2つ目のDBの識別子
    type: "mysql",
    host: process.env.DB2_HOST,
    username: process.env.DB2_USERNAME,
    password: process.env.DB2_PASSWORD,
    database: process.env.DB2_DATABASE,
    synchronize: true,
}
]

参考記事

https://zenn.dev/nkmrkz/articles/typeorm-multi-db

https://stackoverflow.com/questions/58891569/typeorm-doesnt-support-the-database-setting-on-the-entity-decorator

がくがく

接続設定の読み込み

getConnectionOptionsに2つ目のDBの識別子を指定すると、DB設定を読み込むことができる。

index.ts(例)

export class DatabaseHandler {
  private constructor() {}

  static async init() {
    const connectionOptions = await getConnectionOptions()
    
    await createConnection(
      ...
    )

    const db2 = await getConnectionOptions("db2") // 2つ目のDBの識別子を指定
    await createConnection("db2")

    return new DatabaseHandler()
  }
}
がくがく

Repository, Entity Managerの設定

Repository APIを使用している箇所では、以下のように第二引数に2つ目のDBの識別子を指定する

const userRepo = getRepository(UserAccount, "db2")

Entity Managerを使用している箇所では、引数に2つ目のDBの識別子を指定する

const dbHandler = getManager("db2")
がくがく

EntityでのDB識別子指定

複数DB構成で片方のDBコネクションを使用したい場合、EntityごとにDBを指定できる模様。

import { Entity, Unique, Column, OneToMany, ManyToOne, JoinColumn } from "typeorm"

@Entity({ database: "db2" })
export class Item extends BaseModel {
...
}
がくがく

シーディング

typeorm-seedingも-cオプションを付けることにより、コネクションを指定して実行できる。

export class CreateUserSeeds implements Seeder {
  public async run(factory: Factory, connection: Connection) {
  ...
  }
}