3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TypeORMを利用したカラムの一括更新

Last updated at Posted at 2020-11-17

概要

TypeORMで多くのデータをまとめて更新しようとしたときに、大量のクエリが発行されてしまい困ったので、対処方法をまとめました。
やりたかったこととしては、以下の2つです。

  1. 特定のカラムを特定値に更新
  2. 特定のカラムを条件に応じた値に更新

1. 特定のカラムを特定値に更新

あるテーブルtableに対して、column1value1に更新する場合を考えます。
これは公式ドキュメントにもある通り、QueryBuilderを利用することで以下のように記述が可能です。

sample_code_1
await getConnection()
    .createQueryBuilder()
    .update(table)
    .set({ column1: "value1" })
    .execute();

実際に実行されるSQLは以下のようになります。

executed_sql_1
UPDATE "table"
SET "column1" = "value1"

大抵はwhere句と一緒に利用されるものと思います。

2. 特定のカラムを条件に応じた値に更新

あるテーブルtableに対して、以下のように条件分岐するように更新する場合を考えます。

  • column1case1の場合に、column1value1-1に更新
  • column1case2の場合に、column1value1-2に更新
  • column1case3の場合に、column1value1-3に更新
  • 上記以外の場合は更新しない

これはCASE文で場合分けして更新するようにします。

sample_code_2
await getConnection()
    .createQueryBuilder()
    .update(table)
    .set({
        column1: () => (
            'CASE WHEN column1 = "case1" THEN "value1-1"' +
            'CASE WHEN column1 = "case2" THEN "value1-2"' +
            'CASE WHEN column1 = "case3" THEN "value1-3"' +
            'ELSE table.column1 END'
        )
    })
    .execute();

実際に実行されるSQLは以下のようになります。

executed_sql_2
UPDATE "table"
SET "column1" = CASE
    WHEN "column1" = "case1" THEN "value1-1"
    WHEN "column1" = "case2" THEN "value1-2"
    WHEN "column1" = "case3" THEN "value1-3"
    ELSE table.column1 END

更新対象のデータが少ない場合であれば1件ずつ更新する方法でも問題ありませんが、多くなってきた場合は上記のように一括更新する方法も検討してみると良いと思います。

参考文献

TypeORMの公式ドキュメント

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?