更新・削除をDB化
変更系も run で行う
更新も削除も、書き込みなので run を使います。
JavaScript
db.prepare("UPDATE items SET name = ?, price = ? WHERE id = ?").run(name, price, id);
db.prepare("DELETE FROM items WHERE id = ?").run(id);プレースホルダは並んだ順に埋まります。WHERE に入る id も値なので、こちらも ? です。外から来た値は全部 ? に渡す、と覚えてください。
WHERE を書き忘れると全件が変わる
もっとも怖い書き間違いがこれです。
SQL クエリ
UPDATE items SET sold = 1; -- 全商品が売り切れになる
DELETE FROM items; -- 全商品が消えるどちらもエラーになりません。そう書いたのだから、そのとおり実行されます。変更系を書いたら、WHERE があるかを必ず見てください。
何件変わったかで判断する
第4章では、更新の前に find で対象を探して 404 を判定していました。データベースなら、実行の結果から分かります。
JavaScript
const result = db.prepare("UPDATE items SET name = ? WHERE id = ?").run(name, id);
if (result.changes === 0) {
return res.status(404).json({ error: "商品が見つかりません" });
}changes に、実際に変わった行数が返ります。0 なら、その id の商品が無かったということです。探してから更新する 2 往復が、1 回で済みます。
削除も同じです。changes が 0 なら 404 を返します。
更新したものを返す
更新の応答には、更新後の内容を返します。run は行そのものを返さないので、読み直します。
JavaScript
const updated = db.prepare("SELECT id, name, price FROM items WHERE id = ?").get(id);
res.json(updated);削除は 204 なので、本文はありません。読み直す必要もありません。
手を動かす
演習では、更新と削除をデータベースに置き換えます。changes で 404 を見分けてください。
要件
PUT /items/:idはUPDATEして、更新後の{id, name, price}を返すDELETE /items/:idはDELETEして 204 を本文なしで返す- どちらも
changesが 0 なら 404 で{"error":"商品が見つかりません"}を返す
入出力例
request("PUT", "/items/1", {"name":"革のスニーカー","price":5200}) → "200 {"id":1,"name":"革のスニーカー","price":5200}"
request("PUT", "/items/999", {"name":"x","price":1}) → "404 {"error":"商品が見つかりません"}"
request("DELETE", "/items/1") → "204 "
request("DELETE", "/items/999") → "404 {"error":"商品が見つかりません"}"
request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}]"ヒント
編集 ゆめさく編集部