2
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 with PostgreSQLでTruncate Cascadeしたい

Last updated at Posted at 2020-08-11

背景

TypeORMを使った開発でテストを作成しようとした時、外部キーありのテーブルのtruncateをしたかった。
なお、環境は下記です。

Postgresql: v12.3
TypeOrm: v0.2.25

Truncate Cascadeの実行

PostgreSQLでは、Relationがあるテーブルをtruncateしようとすると、

 cannot truncate a table referenced in a foreign key constraint

と、外部キー制約あるからtruncateできねえよって怒られます。
まあ、truncateはテーブルのデータ情報を取得しにいかずに消すので、そりゃそうだよねと。
だから、deleteよりも高速で消せるわけですし。

まあ、でもテストだしいらないデータは消したいよねってことで、強制的に消そうとした時に下記のように、CASCADEをつけると参照しているテーブルのデータを含め全部消せます。

# TRUNCATE [スキーマ.テーブル名] CASCADE;

で、TypeORMでも簡単にできればいいな〜と思って調べてみたところ、tuncateはclearメソッドでできることが分かったのですが、clearメソッドにはCASCADEオプションはなかったorz

仕方ないので、下記のようなコードを書いて一旦対応できるようにしてみました。

export const truncateTestData = async (tableNameList: string[]) => {
  const connection = await getConnection();

  for (const table of tableList) {
    // Entity Objectは、keyがテーブルの名前、valueがそのテーブルのEntityを指してる。
    const tableMeta = connection.getMetadata(Entity[table]);

    await connection
      .getRepository(Entity[table])
     // tableMeta.tablePathに、schema.tableNameの情報が入ってる
     // ex) public.users
      .query(`TRUNCATE ${tableMeta.tablePath} CASCADE;`);
  }
};

一旦、上記でしのいだけど、そのうちなんとかするつもりはありそう。

結論

TypeORMでは、TRUNCATE CASCADEはできなそうだったんで、どうしてもやりたかったらメタデータとか取得しながらやるしかないかも。でもそのうちなんとかなりそう。

2
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
2
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?