はじめに
現在、React×TupeScriptでアプリを作成中です。
昨日分のデータを削除するバッチ処理の実装を行ったので、その内容をまとめます。
使用言語: TypeScript
DB(Baas): Supabase
削除したいデータ: ユーザー情報(usersテーブル)・ユーザーのスキル情報(user_skillテーブル)
やりたいこと
下記のコマンドを実行すると、昨日に登録されたユーザー情報とスキル情報がDB上から削除されるようにします。
npx tsx ./batch/index.ts
処理の流れ
1. 昨日の日付を計算する
現在の日付を取得して、現在の日付から1日前の日付を計算します。
2. 昨日の始まりと終わりを設定する
昨日の始まりは0:00(午前)で、昨日の終わりは23:59:59(午後)です。
時刻はUTC(世界協定時)で設定します。(Supabase上でのタイムスタンプはUTCを採用しているため)
3. ユーザー情報を削除する
昨日の日付に作成されたユーザー情報を削除します。
4. スキル情報を削除する
同様に、昨日の日付に作成されたスキル情報も削除します。
5. 削除結果を表示する
ユーザー情報とスキル情報の削除結果を表示します。
エラーが発生した場合は、その内容も表示します。
6. 処理の完了を通知する
データの削除が完了したことを通知します。
実装例
import { supabase } from "../src/utils/supabase";
async function deleteUserData() {
//1&2.昨日の0:00のUTC
const startedYesterday = new Date();
startedYesterday.setDate(startedYesterday.getDate() - 1);
startedYesterday.setUTCHours(0, 0, 0, 0);
//1&2.昨日の23:59:59のUTC
const endedYesterday = new Date();
endedYesterday.setDate(endedYesterday.getDate() - 1);
endedYesterday.setUTCHours(23, 59, 59, 999);
// 3.削除するユーザー情報の条件を指定
const userDeleteResult = await supabase
.from("users")
.delete()
// 削除条件を追加
.gte("created_at", startedYesterday.toISOString())
.lte("created_at", endedYesterday.toISOString());
console.log("startedYesterday:", startedYesterday);
console.log("endedYesterday:", endedYesterday);
// 5.削除した行数をログに出力
console.log("Deleted user data:", userDeleteResult);
// 4.削除するスキル情報の条件を指定
const skillDeleteResult = await supabase
.from("user_skill")
.delete()
//
.gte("created_at", startedYesterday.toISOString())
.lte("created_at", endedYesterday.toISOString());
//5. 削除した行数をログに出力
console.log("Deleted skill data:", skillDeleteResult);
}
// 6. 処理の完了を通知する
deleteUserData()
.then(() => console.log("Deletion complete!"))
.catch((error) => console.error("Deletion failed:", error));
注意点
日付はUTC(世界協定時)かつSO8601形式で渡さないと、Supabase側で認識されなかったため、toISOString()
を使用しました。
これを使わないと、"time zone "gmt+0900" not recognized" というエラーが出てしまいます。
おわりに
使用している言語や環境が違っても、全体の処理の流れや考え方は変わらないと思うので、参考になれば幸いです。