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 檔案同步),重新建構並將部署指向空資料庫以重新啟動。 - 架構和範本不一致。 部署和架構變更是獨立的,因此要有意識地安排順序:新增性的架構變更(新集合、新選擇性欄位)先進行,然後部署使用它們的程式碼。對於移除,先部署停止使用該欄位的程式碼,然後移除欄位。