はじめに
Supabaseのテーブルにあるデータを削除するバッチファイルを作成し、ファイル実行時に一括で削除しようとしたところ下記のエラーが発生しました。
レコードの削除中にエラーが発生しました: {
code: '21000',
details: null,
hint: null,
message: 'DELETE requires a WHERE clause'
}
問題
エラーメッセージの「DELETE requires a WHERE clause」とあるようにWHERE句がないことが指摘されています。
調べてみると、今回使用しているpostgres SQLにはテーブルデータの安全性を確保するためにWHERE句が使用できないような機能がデフォルトでされている可能性があり、そのことがエラーの原因となっているようでした。この機能自体は意図していない削除が行われないような安全対策のようです。
解決法
今回は明示的にWHERE句を要求することで解決することできました。
以下手順です。
まず、削除用のPostgreSQL関数を作成します。
SupabaseのSQLエディタを開いて、以下のクエリをテーブル名を変更して実行します。
CREATE OR REPLACE FUNCTION delete_all_records()
RETURNS void LANGUAGE plpgsql AS $$
BEGIN
DELETE FROM テーブル名 WHERE true;
END;
$$;
その後、バッチファイルを下記のように設定します。
import { supabase } from "../src/utils/supabase";
async function cleanupRecords() {
try {
console.log("クリーンアップ処理を開始します。");
const { error } = await supabase.rpc('delete_all_records');
if (error) {
console.error("レコードの削除中にエラーが発生しました:", error);
} else {
console.log("すべてのレコードが削除されました。");
}
console.log("クリーンアップ処理が完了しました。");
} catch (error) {
console.error("クリーンアップ処理中にエラーが発生しました:", error);
process.exit(1);
}
}
cleanupRecords().catch(error => {
console.error("予期せぬエラーが発生しました:", error);
process.exit(1);
});
const { error } = await supabase.rpc('delete_all_records');
で使用しているrpc関数はデータベース上で定義された関数を呼び出すものになります。
今回はdelete_all_records()を上記で作成したものを呼び出して実行をしています。
上記を実行することでエラーの発生がなくなり、指定のテーブルからデータを削除することができました。
おわりに
今回はエラーの原因はすぐにわかったのですが、解決法があまりなく解消までに時間がかかりましたが、新しくデータベース上で関数定義する方法を学ぶことができました。
同じようなエラーが出た方の参考になれば幸いです。