type holyshared = Engineer<mixed>

技術的なことなど色々

TypeORM 0.3.0の変更点

TypeORM 0.3.0では破壊的な変更がいくつか含まれています。

ConnectionからDataSource

ConnectionからDataSource、ConnectionOptionsからDataSourceOptionsにクラス名が変更になっています。
またcreateConnectionなどのユーティリティ関数も軒並みDeprecatedになっているので、しばらくは大丈夫なのですが、一気に変えてしまった方がよさそうです。

また接続処理の部分は別途変更する必要があります。

この変更はtsで接続設定の型指定が効くので、typoや間違った設定をしにくくなるのでいい変更だと思います。

import "reflect-metadata"
import { DataSource } from "typeorm"
import { User } from "./model/entity/User"
import { resolve } from "path"

const migrationsPath = resolve(__dirname, "model/migration")

export const AppDataSource = new DataSource({
  type: "postgres",
  host: "localhost",
  port: 5432,
  username: "example",
  password: "example",
  database: "example",
  entities: [User],
  synchronize: false,
  logging: false,
  migrations: [`${migrationsPath}/*{.js,.ts}`]
})

ormconfigの廃止

データベースの接続情報をormconfig.jsonで持てるようになっていましたが、それが廃止になる予定です。
代わりにDataSourceを使います。

複数のデータベースを扱っている場合は、データベース単位でDataSourceを定義する必要がありそうです。
なぜならマイグレーションを実行する時のデータベース指定がファイルを指定するようになっているためです。

マイグレーションの指定方法

typeorm migration:run -d ./dist/data-source1.js # データソース1
typeorm migration:run -d ./dist/data-source2.js # データソース2

一応、一つのDataSourceでも複数のDBに永続化はできる見たいですが、ドキュメント見る限りエンティティ毎にデータソースを指定する必要があるので面倒なのと、ローカルで検証用のDBとテスト用のを分けてテストしたい時に困りそうです。

AbstractRepositoryを使用したカスタムリポジトリの廃止

カスタムリポジトリを扱いたい場合、AbstractRepositoryを継承することで独自のリポジトリを定義できるようになっていて、比較的自由な実装ができるようになっていましたがそれができなくなりました。

代わりにextendを使用して独自のメソッドを定義できるのみなっています。

import { Repository } from "typeorm"
import { AppDataSource } from "./data-source"
import { User } from "./model/entity/User"

type CustomUserRepository = Repository<User> & {
  example(name: string) : Promise<User>
}

export const UserRepository = AppDataSource.getRepository(User).extend({
  // thisのコンテキストがわかるように型を指定する
  async example(this: CustomUserRepository, name: string) {
    return this.createQueryBuilder().getOne()
  }
})

AbstractRepositoryを継承しなくて良くなった点はいいのですが、設計の自由度が減ってしまいました。
DDDが割と実践しやすかった点がなくなってしまっています。

まとめ

カスタムリポジトリがカスタムとは?という感じになってしまっていましたが、割と健全な方な修正で良かったかなと思います。