背景
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はできなそうだったんで、どうしてもやりたかったらメタデータとか取得しながらやるしかないかも。でもそのうちなんとかなりそう。