みなさんこんにちは、現役エンジニアのサメハックです
アパレル企業でトップ販売員を経て
未経験から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更新
という順で処理を行うよ!
・取得したデータを更新
・更新したデータをsave関数に渡してDB更新
という順で処理を行うよ!
DELETE
// 対象のデータを取得※RID等プライマリキーを渡す
const データ1 = await database.getRepository(リポジトリ1).findOne(RID)
// データを更新
データ1.name = "新しい値"
// データを削除
await database.getRepository(リポジトリ1).remove(データ1);
【重要】findOneを使わず、独自の関数でデータ取得する場合
getRawManyではなく、getManyを使用してください
・対象のデータの取得
・取得したデータをremove関数に渡してデータ削除
という順で処理を行うよ!
・取得したデータを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文以外は無視されるよ!
.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を使うのがマストだよ!
この場合もcountを使うのがマストだよ!
getSql
query.getSql()
発行されたSQL文を取得できるよ!
getCount
query.getCount()
該当するデータの件数を取得できるよ!
getMany
query.getMany()
※select関数と併用すると、データが取得できないケースがあります。
該当するデータを全て取得できるよ!
データ型やパラメータはEntityファイルのものがそのまま適合されるよ!
データ型やパラメータはEntityファイルのものがそのまま適合されるよ!
getRawMany
query.getRawMany()
※主にselect関数ありの場合に使用します。
【重要】DELETE処理用のデータ取得の際には使えません。
該当するデータを全て取得できるよ!
パラメータはEntityファイルのものがそのまま適合されるよ!
パラメータはEntityファイルのものがそのまま適合されるよ!
満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈