在上一篇我們介紹了 Workers KV,它適合做快取、設定、session 這類「Key-Value」型的資料儲存。但如果我們需要 更複雜的查詢,像是篩選、排序、關聯,單純的 KV 就不夠用了。
這時候,Cloudflare 推出的 D1 資料庫 就登場啦!
D1 是 Cloudflare 推出的 Serverless SQL Database,基於 SQLite 打造。
它結合 Workers,讓我們可以在邊緣直接存取結構化資料,用熟悉的 SQL 查詢,卻不用管理伺服器。
簡單來說,D1 就是「SQLite as a Service」,幫你把 SQLite 放到全球的 Cloudflare 邊緣節點。
SELECT
、JOIN
、ORDER BY
、GROUP BY
等操作。小型應用的主要資料庫
例如部落格、留言板、簡單電商後端。
查詢需求較高的應用
需要 WHERE
條件、排序或關聯查詢。
Workers + D1 全套應用
不用額外找雲端 DB,Workers 處理邏輯,D1 負責資料。
原型開發
不需要花時間建 MySQL / PostgreSQL,就能快速上線。
在 Cloudflare 後台 D1 新增資料庫,並新增一個 Users 資料表,裡面有一個欄位 name
將 Workers 與 D1 綁定,並使用以下程式碼
訪問 /add 就會在資料庫加上一筆 Alice,訪問 /list 查看清單
export default {
async fetch(request, env) {
const { pathname } = new URL(request.url);
if (pathname === "/add") {
await env.DB.prepare("INSERT INTO users (name) VALUES (?)")
.bind("Alice")
.run();
return new Response("User added");
}
if (pathname === "/list") {
const { results } = await env.DB.prepare("SELECT * FROM users").all();
return new Response(JSON.stringify(results));
}
return new Response("D1 Demo");
},
};
雖然 D1 很方便,但也有一些限制需要注意:
欄位修改限制:建立資料表後,不能刪除或修改欄位,只能新增欄位。
若需要改 schema,建議做法是建立新表 → 匯入舊資料 → 捨棄舊表。
例如要把 name
拆成 first_name
和 last_name
,必須新建一張 users_new
表,再用 INSERT INTO ... SELECT
遷移資料。
不是即時同步:D1 還在逐步擴展全球分佈,和 KV 的「最終一致性」不同,延遲模型需要關注。
容量限制:目前單一資料庫大小上限為 2GB,不適合超大型系統。
功能尚在發展:部分 SQLite Extension 尚未支援,需留意官方更新。
計費:依照查詢次數與儲存大小收費,細節可參考 官方文件。
特性 | Workers KV | D1 (SQLite) |
---|---|---|
資料型態 | Key-Value | SQL (表格、欄位) |
查詢能力 | 只能用 Key 讀取 | 支援完整 SQL 查詢 |
延遲 | 全球邊緣、讀取快 | 邊緣存取,查詢稍高延遲 |
最適合用途 | 設定、快取、Session、Flag | 主資料庫、需要複雜查詢的應用 |
容量上限 | 幾乎無上限(數十億筆) | 2GB |
兩者搭配起來,能讓 Cloudflare Workers 應用更完整:
KV 負責快取與即時設定,D1 負責資料儲存與查詢。
這家雖然只開在白天,晚上夜市時段就沒開,不過卻是好吃的腿庫飯,值得來吃