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 items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
price INTEGER,
sold INTEGER DEFAULT 0
)
`);AUTOINCREMENT は、第4章で自分で書いた「最大の id + 1」を、データベースが代わりにやってくれる指定です。DEFAULT 0 は、指定しなければ 0 が入るという意味です。
3つの呼び出し方
SQL を実行する方法は、返ってくるものによって分かれます。
| 書き方 | 返るもの | 使う場面 |
|---|---|---|
db.exec(sql) | 何も返らない | 表を作る、まとめて流す |
db.prepare(sql).get(...) | 1 行 | 1 件だけ取る |
db.prepare(sql).all(...) | 行の配列 | 一覧を取る |
db.prepare(sql).run(...) | 実行結果 | 書き込む |
get は見つからなければ undefined、all は見つからなければ空の配列を返します。第4章で「1 件は 404、一覧は空配列」と決めたことに、そのまま対応します。
手を動かす
演習では、データベースにつないで表を作り、1 件取り出すところまでを書きます。まずは往復できることを確かめてください。
要件
node:sqliteのDatabaseSyncでメモリ上のデータベースを作るitems表をid INTEGER PRIMARY KEYname TEXTprice INTEGERの形で作る- 受け取った商品を入れ、指定された id の商品を
{id, name, price}の形で返す(無ければnull)
入出力例
setupAndFetch([{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}], 1) → {"id":1,"name":"レザースニーカー","price":4800}
setupAndFetch([{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}], 2) → {"id":2,"name":"古着のデニムジャケット","price":6200}
setupAndFetch([{"id":1,"name":"レザースニーカー","price":4800}], 999) → null
setupAndFetch([], 1) → nullヒント
編集 ゆめさく編集部