EmDash 将集合、字段和分类法与内容一起存储在数据库中。使用本指南更改运行中的内容模型,而不与代码部署、首次种子化或 EmDash 核心迁移混淆。示例使用 Cloudflare D1;相同的分离适用于每个数据库适配器。
什么更改什么
站点经历四个不同的工作流程。每个工作流程影响不同的层:
| 工作流程 | 更改的内容 | 方式 |
|---|---|---|
| 内容编辑 | 条目、媒体、设置 | 管理面板或内容 API |
| 代码部署 | 模板、配置、EmDash 版本 | wrangler deploy — 可能迁移 EmDash 管理的数据库表 |
| 首次引导 | 所有(从空开始) | 迁移 + 种子文件 + 设置向导,首次启动时自动 |
| 模式演进 | 集合、字段、分类法 | 管理面板或对运行站点执行 emdash schema(本页) |
种子文件仅参与第三行。当数据库为空且设置向导未完成时应用一次。对现有数据库部署更改的种子文件不会产生任何效果 — 运行站点的模式演进始终通过管理面板或 API 进行。
在管理面板中更改模式
管理面板是演进已部署站点的主要方式。在管理界面中打开 Content Types,添加、编辑或删除集合和字段。更改立即生效 — 内容 API、加载器和编辑界面都在运行时从数据库读取模式。
有关可用的字段类型、验证规则和小部件选项,请参见集合与字段。
更改模式后,重新生成模板使用的 TypeScript 类型。emdash types 命令从运行中的实例读取模式,因此可以直接指向已部署的站点:
npx emdash types --url https://example.com
从 CLI 更改模式
emdash schema 命令通过 REST API 与运行中的实例通信,因此它们对已部署的站点和本地开发的工作方式相同。使用设备流程进行一次认证:
npx emdash login --url https://example.com
或者,在管理界面的 设置 → API 令牌 下创建 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
这些命令可以检入脚本,使每个环境接收相同的有序更改。命令不是自动幂等的:对已存在的对象重新运行 create 或 add-field 可能会失败。使用 emdash schema list 或 get 检查目标,记录哪个环境完成了每个步骤,并在第一个错误时停止。
完整命令列表请参见 CLI 参考。
保持种子文件同步
构建中嵌入的种子文件决定了全新数据库初始化的内容:新的预览环境、灾难恢复重建或同一站点的第二次部署。如果种子仍然描述的是入门博客,而生产环境已经演进为其他内容,那么每个新环境都会用错误的模型引导。
构建嵌入在 .emdash/seed.json、package.json#emdash.seed 中的路径或 seed/seed.json 中首先找到的种子文件。如果都不存在,则嵌入内置的默认种子(入门博客模型),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
导出的种子包含运行站点的设置、集合、分类法、菜单和小部件区域。添加 --with-content 以包含条目。将更新的 .emdash/seed.json 与依赖新模式的代码一起提交,使新环境始终引导到代码理解的模型。
在预览环境中排练更改
破坏性的模式更改(删除字段、重构集合)最安全的做法是对生产的一次性副本进行排练。
-
创建单独的预览 D1 数据库,让 Wrangler 将其添加到
preview环境:npx wrangler d1 create emdash-db-preview \ --binding DB --env preview --update-config确认
env.preview.d1_databases包含新的数据库名称和 UUID。绑定不会从顶层 Wrangler 配置继承。 -
导出生产数据,然后通过预览环境的
DB绑定导入 SQL:npx wrangler d1 export emdash-db --remote --output=./prod.sql npx wrangler d1 execute DB --env preview --remote --file=./prod.sql -
构建项目,将其部署到预览环境,然后对预览 URL 执行模式更改:
npm run build npx wrangler deploy --env preview npx emdash schema remove-field posts legacy_field --url https://preview.example.com -
验证公共页面、管理表单、生成的类型以及读取更改字段的任何模板。创建新的生产数据库备份,然后对生产执行一次相同的命令。
从错误中恢复
- 字段被误删。 列及其数据已从运行数据库中消失。从 D1 Time Travel 时间点备份恢复,或重新添加字段并从之前的
wrangler d1 export恢复其值。 - 新环境用错误的模型引导。 嵌入的种子已过时或缺失。更新
.emdash/seed.json(参见保持种子文件同步),重新构建,并将部署指向空数据库以重新引导。 - 模式与模板不一致。 部署和模式更改是独立的,因此要有意识地排序:添加性模式更改(新集合、新可选字段)在先,然后是使用它们的代码。对于删除,先部署停止使用该字段的代码,然后删除字段。