資料庫選項

本頁內容

EmDash 支援多種資料庫後端。根據你的部署目標進行選擇。

概述

資料庫最適合部署
D1Cloudflare Workers邊緣,全球分佈
PostgreSQL生產環境 Node.js任何支援 Postgres 的平台
libSQL遠端資料庫邊緣或 Node.js
SQLiteNode.js,本地開發單伺服器

Cloudflare D1

D1 是 Cloudflare 的無伺服器 SQLite 資料庫。在部署到 Cloudflare Workers 時使用它。

import { d1 } from "@emdash-cms/cloudflare";

export default defineConfig({
	integrations: [
		emdash({
			database: d1({ binding: "DB" }),
		}),
	],
});

設定

選項型別預設值描述
bindingstring來自 wrangler.jsonc 的 D1 繫結名稱
sessionstring"disabled"讀取複製模式(見下文)
bookmarkCookiestring"__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 確保下一個請求至少看到該狀態。
  • 寫入請求POSTPUTDELETE)始終從主資料庫開始。
  • 建置時查詢(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,
			}),
		}),
	],
});

設定

選項型別描述
urlstring資料庫 URL(libsql://...file:...
authTokenstring遠端資料庫的認證權杖(本地可選)

本地開發

在開發期間使用本地 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,
});
選項型別描述
connectionStringstringPostgreSQL 連線 URL
hoststring資料庫主機
portnumber資料庫連接埠
databasestring資料庫名稱
userstring資料庫使用者
passwordstring資料庫密碼
sslboolean啟用 SSL
pool.minnumber最小池連線數(預設 0)
pool.maxnumber最大池連線數(預設 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" }),
		}),
	],
});

設定

選項型別描述
urlstring帶有 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

此命令:

  1. 如果需要,建立資料庫檔案
  2. 執行任何待處理的遷移
  3. 報告目前遷移狀態

遷移檔案

遷移與 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" });