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
你也可以在管理後台的 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
這些指令可以放入指令碼並提交到儲存庫,讓每個環境都接收到相同的、有順序的變更。這些指令並不會自動保持冪等:對已存在的物件重複執行 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
匯出的種子包含線上站台的設定、集合、分類法、選單、重新導向、小工具區域和 sections。加上 --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(參見保持種子檔案同步),重新建置,並讓部署指向一個空資料庫,以再次完成引導。 - 結構描述和範本不一致。 部署和結構描述變更是彼此獨立的,因此要有意識地安排順序:增量式的結構描述變更(新集合、新的可選欄位)先進行,然後再部署使用它們的程式碼。對於移除操作,先部署不再使用該欄位的程式碼,再移除欄位。