はじめに
Prismaをご存知でしょうか?PrismaはオープンソースのORM(Object-relational mapping)で、SQLを書かずにDBを操作できるツールです。
実装内容
book_mstというテーブルがあり、bookIdというカラムを持っています。
指定したbookIdを持つレコードがある場合は該当のレコードを消し、指定したbookIdを持つレコードがない場合は何もしないという処理を実装しようとしていました。
遭遇した課題
Prismaで以下のようなクエリを用意しました。
sql
prisma.book.delete({
where: {
bookId: bookId,
},
});
しかし該当するbookIdがない場合以下のようなエラーが出現しました。
error
An operation failed because it depends on one or more records that were required but not found. Record to delete does not exist.
SQLでは、DELETE文でWHERE句を使用してレコードを削除する際、指定した条件に一致するレコードが存在しない場合でもエラーは発生しないはずです。単に削除対象のレコードが存在しないだけでクエリは正常に完了します。
sql
DELETE FROM book_mst WHERE bookId = 123;
オープンソースを確認すると、この箇所の改善要請は上がっているみたいですがまだ修正されていないようです。
https://github.com/prisma/prisma/issues/4072
解決策
以下のようにレコードの存在確認をしてからクエリを通したらエラーに遭遇しなくなりました!
sql
const existingRecord = prisma.book.findUnique({
where: {
bookId: bookId,
},
});
if (existingRecord) {
prisma.book.delete({
where: {
bookId: bookId,
},
});
}