高瀬博道の技術ブログ

高瀬博道の技術ブログです。

TypeORMに入門する - 2

前回

takasehiromichiex.com

モデルの作成

クイックスタートを使用したので、モデルは以下の通りになっています。

src/entity/User.ts
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column()
  age: number;
}

まず、@Entityで、エンティティを宣言します。

そして、Userクラスを宣言し、id、firstName、lastName、ageを持つテーブルのような形で、@PrimaryGeneratedColumn()や、@Column()で定義します。

ドメインロジックは以下のようになります。

src/index.ts
import { AppDataSource } from "./data-source";
import { User } from "./entity/User";

(async () => {
  await AppDataSource.initialize();

  const userRepository = AppDataSource.getRepository(User);

  const user = new User();

  user.firstName = "Satoh";
  user.lastName = "Kojiro";
  user.age = 23;

  await userRepository.save(user);

  const allUsers = await userRepository.find();
  const satoh = await userRepository.findOneBy({
    firstName: "Satoh",
    lastName: "Kojiro",
  });

  console.log(allUsers);
  console.log(satoh);

  await userRepository.remove(satoh);
})();

AppDataSourceは、まずinitialize()します。

そこから、getRepositoryでリポジトリを生成します。

その後、Userのインスタンスを生成し、値を代入します。

そして、await userRepository.save(user);で、データベースに保存します。

値を参照する際は、await userRepository.find();か、await userRepository.findOneByなどで参照します。

削除する際は、await userRepository.remove(satoh);のように削除します。

Active Record実装

TypeORMは、Active Record実装もできます。

モデルを修正します。

src/entity/User.ts
import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from "typeorm";

@Entity()
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column()
  age: number;
}

BaseEntityを拡張しています。

ドメインロジックを修正します。

src/index.ts
import { AppDataSource } from "./data-source";
import { User } from "./entity/User";

(async () => {
  await AppDataSource.initialize();

  const user = new User();

  user.firstName = "Satoh";
  user.lastName = "Kojiro";
  user.age = 23;
  await user.save();

  const allUsers = await User.find();
  const satoh = await User.findOneBy({
    firstName: "Satoh",
    lastName: "Kojiro",
  });

  console.log(allUsers);
  console.log(satoh);

  await satoh.remove();
})();

npm startしたところ通らなかったので、tsconfigを修正します。

出たエラー

TypeError: Class constructor BaseEntity cannot be invoked without 'new'

参考

qiita.com

tsconfig.json
{
   "compilerOptions": {
      "lib": ["es6"],
      "target": "es6",
      "module": "commonjs",
      "moduleResolution": "node",
      "outDir": "./build",
      "emitDecoratorMetadata": true,
      "experimentalDecorators": true,
      "sourceMap": true
   }
}

npm startしたところ、通るようになりました。

まとめ

ここまでで、

  • モデルの作成について
  • Active Record実装について

を学びました。

次回はステップバイステップガイドを掘り下げようと思います。

コード

今回のコードは、以下に格納しました。

github.com

takasehiromichiex.com