メインコンテンツまでスキップ

TypeORM

リファレンス

歴史

mysqlがある mysql2が

mysql2

パターンスタイルサポート

スタイルとしては、Active RecordとData Mapperの2つのパターンをサポートしている。

version

0.2系が現在主流であるが0.3系が最新(2022/10/09現在)

キャッシュ

リファレンス

デフォルトのキャッシュの有効期間は1000ms(1秒) これは、クエリ ビルダー コードが呼び出されてから1秒後にキャッシュが無効になることを意味します。実際には、これは、ユーザーが3秒以内にユーザー ページを150回開いた場合、この期間中に実行されるクエリは3つだけであることを意味します。1秒間のキャッシュ ウィンドウの間に挿入されたユーザーは、ユーザーに返されません。
デフォルトでは、TypeORMは別のテーブルを参照しquery-result-cache、そこにすべてのクエリと結果を格納します

0.3系 参考

参考URL
参考URL
参考URL
参考URL
参考URL
これが一番参考になるかも
参考URL
参考URL

TypeORM & Express & Dockerで環境構築

TypeORM をサクッと試せる Docker 環境を TypeORM CLI を使って構築する方法

TypeORM CLI option

リファレンス
参考URL

  • create(空のマイグレーションファイル作成) typeorm migration:create src/migration/UserMigration 1655392769030-UserMigration.tsのように空のマイグレーションファイルが作られる。

  • generate(entityからのマイグレーションファイル作成) ※0.3からDB接続設定ファイルがtsファイルの場合は、typeormではなく同時にコンパイルも行う typeorm-ts-node-commonjs を使う必要 npx typeorm-ts-node-commonjs migration:generate src/migration/UserMigration -d src/data-source.ts

  • run(マイグレーション実行) npx typeorm-ts-node-commonjs migration:run -d src/data-source.ts

  • revert(マイグレーションロールバック) npx typeorm-ts-node-commonjs migration:revert -d src/data-source.ts

Find option 一覧

参考URL

const user = connection.getRepository(User).find({
where: [
{ firstName: "Timber", lastName: "Saw" },
]
});
const user = connection.getRepository(User).find({
where: [
{ firstName: "Timber", lastName: "Saw" },
{ firstName: "Stan", lastName: "Lee" }
]
});

entity

参考URL
参考URL(詳しい) entityはDBのテーブルと一対一で構成する。
※実際はClassで作成するため関連するmethodなども記載していいかは議論が生じる

Entityファイル

postgres entity 種類 全entity

@Entity をつけたものがテーブル対象になる。 データベースの列の型は、使用したプロパティの型から推測

データ型 サポートされている列の型

データベースの列の型は、使用したプロパティの型から推測されます。 ただし、列の型をデコレータに明示的に指定することで、データベースがサポートする任意の列の型を使用できる。

サポートしている関係

TypeORMはエンティティ間のいくつかの種類の関係をサポートします。

1対1 1対多、多対1 多対多

サポートしている関数についての関係

関数

表5で説明されているように、これらのそれぞれに対してデコレータと関数がtypeormで提供されています。 説明

OneToOne エンティティ間の1対1の関係を指定する

JoinColumn 1対1リレーションの所有側を指定する

OneToMany エンティティ間の1対多の関係を指定する

ManyToOne エンティティ間の多対1の関係を指定する

ManyToMany エンティティ間の多対多の関係を指定する

JoinTable 多対多関係の所有側を指定する

1対1

@OneToOne(() => )

参照される側。サッカーチーム から コーチを参照(コーチに@OneToOne()を付与) @JOinColumnは必須

@OneToMany()

  @OneToMany(
() => TicketOptionItem,
(ticketOptionItem) => ticketOptionItem.ticket
)
public ticketOptionItems?: TicketOptionItem[];

上を見ればわかるだろう。ひとつのチケットに対して複数のオプションがある。S

Tips

TypeORM知見まとめ

デコレータオプション

名前的にDB側のテーブル設定かと思いきや違うので、設定を変更してもmigrationは発生しない。 親Entityを各種更新した際、いっしょに子も更新するかどうか。取得時には影響しない

TypeORMのEager relationsとLazy relationsについて

参考URL

TypeORMでは、データベースからEntityを取得するときに関連しているEntityを2種類の方法で取得できる。

Eager relations
Entityと関連Entityを同じタイミングで読み込む。

Lazy relations
Promiseを使って任意のタイミングで遅延して読み込む。 オプションで {lazy: true} を設定しなくても型として Promise を指定するとTypeORMは自動的に Lazy relations として扱います。

TypeORMをREPLで実行する

参考URL

TypeORM の Bulk Insert と psql の \copy を比較する

参考URL

TypeORMにおいて、dateDate でなく string にmapされるので気をつけましょう

参考URL

TypeORMにおいての論理削除について

TypeORMで子エンティティへの削除処理の伝搬について