跳转到内容

数据库选项

EmDash 支持多种数据库后端。请根据您的部署目标进行选择。

数据库最佳适用场景部署方式
D1Cloudflare Workers边缘,全局分布式
PostgreSQL生产环境 Node.js任何支持 Postgres 的平台
libSQL远程数据库边缘或 Node.js
SQLiteNode.js,本地开发单服务器

D1 是 Cloudflare 的无服务器 SQLite 数据库。部署到 Cloudflare Workers 时使用它。

astro.config.mjs
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
选项类型默认值描述
bindingstring—来自 wrangler.jsonc 的 D1 绑定名称
sessionstring"disabled"读取复制模式(见下文)
bookmarkCookiestring"__ec_d1_bookmark"会话书签的 Cookie 名称
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db",
"database_id": "your-database-id"
}
]
}
Terminal window
wrangler d1 create emdash-db

D1 支持读取复制,以降低全局分布式站点的读取延迟。启用后,读取查询将被路由到附近的副本,而不是始终访问主数据库。

EmDash 使用 D1 Sessions API 透明地管理此功能。通过 session 选项启用:

astro.config.mjs
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 是 SQLite 的一个分支,支持远程连接。当您需要远程数据库但不想使用 Cloudflare D1 时,请使用它。

astro.config.mjs
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 部署。

astro.config.mjs
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});

您可以使用连接字符串或单独的参数进行连接:

// Connection string
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Individual parameters
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 },
});

使用 better-sqlite3 的 SQLite 是 Node.js 部署中最简单的选项。

astro.config.mjs
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
选项类型描述
urlstring以 file: 前缀开头的文件路径

url 必须以 file: 开头:

// Relative path
database: sqlite({ url: "file:./data/emdash.db" });
// Absolute path
database: sqlite({ url: "file:/var/data/emdash.db" });
// From environment variable
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });

EmDash 为 SQLite、libSQL 和 PostgreSQL 自动处理迁移。对于 D1,请通过 Wrangler 运行迁移。

Terminal window
npx emdash init --database ./data.db

此命令:

  1. 如果需要,创建数据库文件
  2. 运行任何待处理的迁移
  3. 报告当前的迁移状态

迁移文件与 EmDash 捆绑在一起。要手动运行它们:

Terminal window
# SQLite/libSQL - migrations run automatically
# D1 - run via wrangler
wrangler d1 migrations apply DB

为每个环境使用不同的数据库:

astro.config.mjs
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" });