EmDash 将集合、字段和分类法存储在数据库中,与内容本身并存。部署新代码不会更改它们:部署会替换 Worker(或服务器)代码,而数据库中的架构和内容保持不变。本页说明如何更改已部署站点的内容模型,以 Cloudflare D1 为例。相同的工作流程适用于其他数据库选项。
什么改变什么
站点经历四个不同的工作流程。每个影响不同的层:
| 工作流程 | 改变的内容 | 如何 |
|---|---|---|
| 内容编辑 | 条目、媒体、设置 | 管理面板或内容 API |
| 代码部署 | 模板、配置、EmDash 版本 | wrangler deploy — 架构和内容不变 |
| 首次引导 | 所有内容(从空开始) | 迁移 + seed 文件 + 设置向导,首次启动时自动执行 |
| 架构演进 | 集合、字段、分类法 | 管理面板或对正在运行的站点执行 emdash schema(本页) |
seed 文件仅参与第三行。它在数据库为空且设置向导未完成时应用一次。对现有数据库部署更改后的 seed 文件不会产生任何效果 — 正在运行的站点的架构演进始终通过管理面板或 API 进行。
在管理面板中更改架构
管理面板是演进已部署站点的主要方式。在管理界面中打开 Content Types,添加、编辑或删除集合和字段。更改立即生效 — 内容 API、加载器和编辑 UI 都在运行时从数据库读取架构。
可用字段类型、验证规则和小部件选项请参阅集合与字段。
更改架构后,重新生成模板使用的 TypeScript 类型。emdash types 命令从运行中的实例读取架构,因此可以直接指向已部署的站点:
npx emdash types --url https://example.com
从 CLI 更改架构
emdash schema 命令通过 REST API 与运行中的实例通信,因此它们对已部署站点的工作方式与本地开发相同。使用设备流认证一次:
npx emdash login --url https://example.com
或者,在管理界面的 Settings → API Tokens 中创建 API 令牌,并通过 --token 或 EMDASH_TOKEN 环境变量传递 — 对 CI 很有用。
然后使用与本地相同的命令演进架构:
npx emdash schema add-field posts subtitle --type string --label "Subtitle" --url https://example.com
npx emdash schema remove-field posts legacy_field --url https://example.com
npx emdash schema create projects --label Projects --url https://example.com
由于这些命令是简单的 CLI 调用,可以脚本化:内容模型的可重复”迁移”是 emdash schema 调用的 shell 脚本,提交到仓库中并依次对每个环境运行。
完整命令列表请参阅 CLI 参考。
保持 seed 文件同步
构建中嵌入的 seed 文件决定了新数据库初始化为什么:新的预览环境、灾难恢复重建或同一站点的第二次部署。如果 seed 仍然描述的是启动博客,而生产环境已经演进为其他内容,则每个新环境都会用错误的模型引导。
构建嵌入在 .emdash/seed.json、package.json#emdash.seed 中的路径或 seed/seed.json 中找到的第一个 seed 文件。如果都不存在,则嵌入内置的默认 seed(启动博客模型),并且 astro dev 记录警告。
演进已部署站点的架构后,将实时模型导出回仓库。emdash export-seed 读取本地 SQLite 文件,wrangler d1 export 从已部署的 D1 数据库生成一个:
npx wrangler d1 export emdash-db --remote --output=./prod.sql
sqlite3 prod.db < prod.sql
npx emdash export-seed --database prod.db > .emdash/seed.json
导出的 seed 包含实时站点的设置、集合、分类法、菜单和小部件区域。添加 --with-content 以包含条目。将更新的 .emdash/seed.json 与依赖新架构的代码一起提交,使新环境始终用代码能理解的模型引导。
在预览环境中排练更改
破坏性的架构更改(删除字段、重组集合)最安全的做法是在生产环境的一次性副本上排练。
-
在
wrangler.jsonc中添加一个拥有自己 D1 数据库的预览环境:{ "env": { "preview": { "d1_databases": [{ "binding": "DB", "database_name": "emdash-db-preview" }], }, }, } -
将生产数据复制进去:
npx wrangler d1 export emdash-db --remote --output=./prod.sql npx wrangler d1 execute emdash-db-preview --remote --file=./prod.sql -
部署并对预览 URL 执行架构更改:
npx wrangler deploy --env preview npx emdash schema remove-field posts legacy_field --url https://preview.example.com -
验证站点能渲染且管理界面行为符合预期,然后对生产环境运行相同的命令。
从错误中恢复
- 字段被误删除。 列和数据已从实时数据库中消失。从 D1 的 Time Travel 时间点备份恢复,或重新添加字段并从之前的
wrangler d1 export恢复其值。 - 新环境用错误的模型引导。 嵌入的 seed 过时或缺失。更新
.emdash/seed.json(参见保持 seed 文件同步),重新构建并将部署指向空数据库以重新引导。 - 架构和模板不一致。 部署和架构更改是独立的,因此要有意识地安排顺序:添加性的架构更改(新集合、新可选字段)先进行,然后部署使用它们的代码。对于删除,先部署停止使用该字段的代码,然后删除字段。