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,
}
]
参考記事
接続設定の読み込み
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 migrations:run -c db2
もしくはtypeorm -c <your-config-name> migration:{run|revert}
でコネクションの指定ができる。
参考
シーディング
typeorm-seedingも-cオプションを付けることにより、コネクションを指定して実行できる。
export class CreateUserSeeds implements Seeder {
public async run(factory: Factory, connection: Connection) {
...
}
}