DBにつなぐ
ファイルではもう足りない
第2章で作ったデータ層は、JSON ファイルに全件を書き戻す形でした。商品が数十件ならこれで動きます。
ですが問題が出てきます。
- 1 件足すだけでも全件を読み書きする
- 「価格が 3000 円以上」を探すには全件を自分で調べる
- 2 人が同時に出品すると、片方の書き込みが消える
データベースは、この 3 つをまとめて解決するために作られたものです。
このコースで使うもの
Node.js 22 には、SQLite というデータベースが最初から入っています。npm で何かを入れる必要はありません。
JavaScript
const { DatabaseSync } = require("node:sqlite");
const db = new DatabaseSync(":memory:");:memory: は「メモリの中に作る」という指定です。プログラムが終われば消えます。ファイル名を渡せば、そのファイルに残ります。
実務では PostgreSQL や MySQL を使うことが多いのですが、SQL の書き方はほとんど同じです。ここで身につけたことはそのまま使えます。
表を用意する
データベースには、まず入れ物の形を教えます。
JavaScript
db.exec(`
CREATE TABLE categories (
code TEXT PRIMARY KEY,
label TEXT,
visible INTEGER DEFAULT 1
)
`);これは商品を分類するための表です。CREATE TABLE の後に表の名前を書き、括弧の中に「列の名前と型」を並べます。列どうしはカンマで区切り、最後の列にはカンマを付けません。TEXT は文字列、INTEGER は整数です。
PRIMARY KEY は、その列を各行の目印にする指定です。この例は文字列の分類コードを使います。商品の id のように整数を目印にする場合は INTEGER PRIMARY KEY と書きます。DEFAULT 1 は、指定しなければ 1 が入るという意味です。
整数の id を自動で増やす AUTOINCREMENT は、第4章で自分で書いた「最大の id + 1」をデータベースに任せる指定です。「出品をDB化」の回で使います。今回は受け取った商品の id をそのまま使うので、この指定は付けません。
3つの呼び出し方
SQL を実行する方法は、返ってくるものによって分かれます。
| 書き方 | 返るもの | 使う場面 |
|---|---|---|
db.exec(sql) | 何も返らない | 表を作る、まとめて流す |
db.prepare(sql) | 1 行 | 1 件だけ取る |
db.prepare(sql) | 行の配列 | 一覧を取る |
db.prepare(sql) | 実行結果 | 書き込む |
get は見つからなければ undefined、all は見つからなければ空の配列を返します。第4章で「1 件は 404、一覧は空配列」と決めたことに、そのまま対応します。
手を動かす
演習では、商品を入れる items 表の作成だけを書きます。接続するコードは用意してあります。db.exec に渡す SQL で、整数の id を主キーにし、文字列の name と整数の price を並べてください。
作った表へ商品を保存し、指定された id で検索する処理は、説明つきの補助関数 saveAndFetch に用意してあります。表ができると、この関数が保存と検索を行います。表がまだ無い間は null を返すので、ひな形のままでも実行できます。保存と検索の SQL を自分で書くのは、続く「一覧・詳細をDB化」「出品をDB化」の回です。
要件
setupAndFetchの中でdb.execを使い、CREATE TABLEでitems表を作る- 列を
id INTEGER PRIMARY KEY、name TEXT、price INTEGERの順に定義する - 保存と検索は用意された
saveAndFetchに任せ、接続を閉じて結果を返す処理はそのまま使う
