EmDash 支援多種資料庫後端。根據你的部署目標進行選擇。
概述
| 資料庫 | 最適合 | 部署 |
|---|---|---|
| D1 | Cloudflare Workers | 邊緣,全球分佈 |
| PostgreSQL | 生產環境 Node.js | 任何支援 Postgres 的平台 |
| libSQL | 遠端資料庫 | 邊緣或 Node.js |
| SQLite | Node.js,本地開發 | 單伺服器 |
Cloudflare D1
D1 是 Cloudflare 的無伺服器 SQLite 資料庫。在部署到 Cloudflare Workers 時使用它。
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
設定
| 選項 | 型別 | 預設值 | 描述 |
|---|---|---|---|
binding | string | — | 來自 wrangler.jsonc 的 D1 繫結名稱 |
session | string | "disabled" | 讀取複製模式(見下文) |
bookmarkCookie | string | "__em_d1_bookmark" | 工作階段書籤的 Cookie 名稱 |
設定
wrangler.jsonc
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db",
"database_id": "your-database-id"
}
]
} wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "emdash-db"
database_id = "your-database-id" 建立 D1 資料庫
wrangler d1 create emdash-db
讀取副本
D1 支援讀取複製,為全球分佈的網站降低讀取延遲。啟用後,讀取查詢會路由到附近的副本,而不是總是存取主資料庫。
EmDash 使用 D1 Sessions API 透明地管理這一點。使用 session 選項啟用它:
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
工作階段模式
| 模式 | 行為 |
|---|---|
"disabled" | 無工作階段。所有查詢都傳送到主資料庫。預設值。 |
"auto" | 匿名請求從最近的副本讀取。已認證使用者透過書籤 Cookie 獲得讀寫一致性。 |
"primary-first" | 類似 "auto",但第一個查詢總是傳送到主資料庫。用於寫入非常頻繁的網站。 |
運作原理
- 匿名訪客獲得
first-unconstrained— 讀取傳送到最近的副本以獲得最低延遲。由於匿名使用者從不寫入,他們不需要一致性保證。 - 已認證使用者(編輯者、作者)獲得基於書籤的工作階段。寫入後,書籤 Cookie 確保下一個請求至少看到該狀態。
- 寫入請求(
POST、PUT、DELETE)始終從主資料庫開始。 - 建置時查詢(Astro 內容集合)完全繞過工作階段並直接使用主資料庫。
libSQL
libSQL 是 SQLite 的一個分支,支援遠端連線。當你需要遠端資料庫而不使用 Cloudflare D1 時使用它。
import { libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
}),
}),
],
});
設定
| 選項 | 型別 | 描述 |
|---|---|---|
url | string | 資料庫 URL(libsql://... 或 file:...) |
authToken | string | 遠端資料庫的認證權杖(本地可選) |
本地開發
在開發期間使用本地 libSQL 檔案:
database: libsql({ url: "file:./data.db" });
PostgreSQL
Node.js 部署需要完整關聯式資料庫時支援 PostgreSQL。
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
設定
你可以使用連線字串或個別的參數進行連線:
// 連線字串
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// 個別的參數
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| 選項 | 型別 | 描述 |
|---|---|---|
connectionString | string | PostgreSQL 連線 URL |
host | string | 資料庫主機 |
port | number | 資料庫連接埠 |
database | string | 資料庫名稱 |
user | string | 資料庫使用者 |
password | string | 資料庫密碼 |
ssl | boolean | 啟用 SSL |
pool.min | number | 最小池連線數(預設 0) |
pool.max | number | 最大池連線數(預設 10) |
連線池
配接器在底層使用 pg.Pool。根據你的部署調整池大小:
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
使用 better-sqlite3 的 SQLite 是 Node.js 部署的最簡單選項。
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
設定
| 選項 | 型別 | 描述 |
|---|---|---|
url | string | 帶有 file: 前綴的檔案路徑 |
檔案路徑
url 必須以 file: 開頭:
// 相對路徑
database: sqlite({ url: "file:./data/emdash.db" });
// 絕對路徑
database: sqlite({ url: "file:/var/data/emdash.db" });
// 來自環境變數
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
遷移
EmDash 自動處理 SQLite、libSQL 和 PostgreSQL 的遷移。對於 D1,透過 Wrangler 執行遷移。
檢查遷移狀態
npx emdash init --database ./data.db
此命令:
- 如果需要,建立資料庫檔案
- 執行任何待處理的遷移
- 報告目前遷移狀態
遷移檔案
遷移與 EmDash 捆綁在一起。要手動執行它們:
# SQLite/libSQL - 遷移自動執行
# D1 - 透過 wrangler 執行
wrangler d1 migrations apply DB
基於環境的組態
為每個環境使用不同的資料庫:
import { sqlite, libsql, postgres } from "emdash/db";
import { d1 } from "@emdash-cms/cloudflare";
const database = import.meta.env.PROD ? d1({ binding: "DB" }) : sqlite({ url: "file:./data.db" });
export default defineConfig({
integrations: [emdash({ database })],
});
或根據環境變數切換:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });