【サンプルあり】TypeORMのCRUD処理とトランザクション処理と頻出コマンド【Express】

Express

みなさんこんにちは、現役エンジニアのサメハックです

アパレル企業でトップ販売員を経て
未経験からWebエンジニアに転職し、
現在正社員として5年働いています!

データベースの解説シリーズです。

今回はTypeORMの構文について学んでいきましょう!

駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!

この記事を読むと・・・
  • 簡単なSQL文が書けるようになる

CRUD処理サンプル

CREATE

// 新しいデータ ※プロパティを指定し新しい値を渡す
const 新しいデータ = await database.getRepository(リポジトリ名).create({
  プロパティ名: 値,
});

await database.getRepository(リポジトリ名).save(新しいデータ);
INSERT INTO リポジトリ名(プロパティ名) VALUES (新しいデータ)
create関数を使うことで、対象リポジトリのデータの雛形を作成できるよ!

READ

const データ = await database.getRepository(リポジトリ名).find()
find()では対象のテーブルのデータを全て取得するよ!

UPDATE

// 対象のデータを取得※RID等プライマリキーを渡す
const データ1 = await database.getRepository(リポジトリ1).findOne(RID)

// データを更新
データ1.name = "新しい値"

// データを更新
await database.getRepository(リポジトリ1).save(データ1);
・対象のデータの取得
・取得したデータを更新
・更新したデータをsave関数に渡してDB更新
という順で処理を行うよ!

DELETE

// 対象のデータを取得※RID等プライマリキーを渡す
const データ1 = await database.getRepository(リポジトリ1).findOne(RID)

// データを更新
データ1.name = "新しい値"

// データを削除
await database.getRepository(リポジトリ1).remove(データ1);

【重要】findOneを使わず、独自の関数でデータ取得する場合
getRawManyではなく、getManyを使用してください

・対象のデータの取得
・取得したデータをremove関数に渡してデータ削除
という順で処理を行うよ!

トランザクション

await database.getEntityManager().transaction(async (myTransaction) => {
  /*-------------処理1------------- */
  // 追加するデータ ※プロパティを指定し新しい値を渡す
  データ1 = await database.getRepository(リポジトリ1).create({
    プロパティ名: 値,
  });
  // リポジトリ1へデータ追加※トランザクション対象
  await myTransaction.getRepository(リポジトリ1).save(データ1);

  /*-------------処理2------------- */
  // 追加するデータ ※プロパティを指定し新しい値を渡す
  データ2 = await database.getRepository(リポジトリ2).create({
    プロパティ名: 値,
  });
  // リポジトリ2へデータ追加※トランザクション対象
  await myTransaction.getRepository(リポジトリ2).save(データ2);

  /*-------------処理3------------- */
  // 追加するデータ ※プロパティを指定し新しい値を渡す
  データ3 = await database.getRepository(リポジトリ3).create({
    プロパティ名: 値,
  });
  // リポジトリ3へデータ追加※トランザクション対象
  await myTransaction.getRepository(リポジトリ3).save(データ3);
});

トランザクションとは、複数のデータ処理をグルーピングすることです。
上の例ですと、処理1・処理2・処理3が全て正常に動作することが確認できた上で
初めて実際にDBにデータを反映(コミット)する処理のことです。

transaction関数内のmyTransactionが全て成功する場合のみDB更新されるよ!

その他のよく使う関数

find

database.getRepository(リポジトリ名).find()
対象テーブルのデータを全て取得するよ!

findOne

database.getRepository(リポジトリ名).findOne(値)
~~~~ FROM リポジトリ名 WHERE カラム名 IN 値
エンティティで@PrimaryGeneratedColumnに指定したカラムの値が一致した
最初のデータを取得するよ!

select文

const query = this.createQueryBuilder("table1").select("カラム名", "別名")
SELECT カラム名 AS 別名
.select(“カラム名”, “別名”)
.select(“カラム名”, “別名”)
のように複数回selectすると最後のselect文以外は無視されるよ!

addSelect文

const query = this.createQueryBuilder("table1")
  .select("カラム名1", "別名1")
  .addSelect("カラム名2", "別名2");
SELECT カラム名1 AS 別名1, カラム名2 AS 別名2, 
複数のSELECT処理が実行されるよ!

where文

変数なし

const query = this.createQueryBuilder("table1")
  .where("条件式")

変数あり

const query = this.createQueryBuilder("table1")
  .where("table1.name= :変数X", {変数X})
table1.nameと変数Xの値が一致するデータを取得するよ!

andWhere文

const query = this.createQueryBuilder("table1")
  .where("条件式1")
  .andWhere("条件式2")

innerJoin

const query = this.createQueryBuilder("table1")
  .innerJoin("table1.リレーション設定したカラム名", "別名")
INNER JOIN カラム名 別名 ON ~~~~
シンプルにJoinするよ!

innerJoin※AND文あり

const query = this.createQueryBuilder("table1")
  .innerJoin("table1.リレーション設定したカラム名", "別名", "条件式")
INNER JOIN カラム名 別名 ON ~~~~ AND (条件式)

innerJoinAndSelect

const query = this.createQueryBuilder("table1")
  .innerJoinAndSelect("table1.リレーション設定したカラム名", "別名")
Join先のテーブルの値を集約することがマストになるよ!

groupBy

countと併用

const query = this.createQueryBuilder("table1")
  .select("count(table1.カラムX)")
  .groupBy("table1.カラムX")
この場合countを使うのがマストだよ!

リレーションあり

const query = this.createQueryBuilder("table1")
  .innerJoin("table1.リレーション設定したカラム名", "table2")
  .groupBy("table1.カラム名", "table2.カラム名")
INNER JOIN カラム名 別名 GROUP BY table1.カラム名, table2.カラム名
指定したカラム名でグルーピングするよ!

addGroupBy

const query = this.createQueryBuilder("table1")
  .select("count(table1.カラムX)")
  .groupBy("table1.カラムX")
  .addGroupBy("table1.カラムY")
グルーピングする条件を追加するよ!
この場合もcountを使うのがマストだよ!

getSql

query.getSql()
発行されたSQL文を取得できるよ!

getCount

query.getCount()
該当するデータの件数を取得できるよ!

getMany

query.getMany()

※select関数と併用すると、データが取得できないケースがあります。

該当するデータを全て取得できるよ!
データ型やパラメータはEntityファイルのものがそのまま適合されるよ!

getRawMany

query.getRawMany()

※主にselect関数ありの場合に使用します。
【重要】DELETE処理用のデータ取得の際には使えません。

該当するデータを全て取得できるよ!
パラメータはEntityファイルのものがそのまま適合されるよ!

満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈

タイトルとURLをコピーしました