EmDash 將集合、欄位和分類法與內容一起儲存在資料庫中。請使用本指南來變更這個線上內容模型,同時不要把它與程式碼部署、首次種子初始化或 EmDash 核心遷移混淆。範例使用 Cloudflare D1;同樣的區分適用於每一種資料庫轉接器。
什麼會改變什麼
站台會經歷四種不同的工作流程。每一種作用於不同的層:
| 工作流程 | 變更內容 | 方式 |
|---|---|---|
| 內容編輯 | 項目、媒體、設定 | 管理後台或內容 API |
| 程式碼部署 | 範本、設定、EmDash 版本 | wrangler deploy — 可能會遷移由 EmDash 管理的資料庫資料表 |
| 首次引導(bootstrap) | 從空白開始的一切 | 遷移 + 種子檔案 + 設定精靈,首次啟動時自動執行 |
| 結構描述演進 | 集合、欄位、分類法 | 管理後台,或針對線上站台執行 emdash schema(本頁) |
種子檔案只參與第三列。它的結構描述和結構只會套用一次,即在設定精靈完成之前的第一個請求時。將修改後的種子檔案部署到既有的資料庫上不會產生任何效果——演進線上站台的結構描述始終透過管理後台或 API 進行。
在管理後台中變更結構描述
管理後台是演進已部署站台的主要方式。在管理後台中開啟 Content Types,新增、編輯或移除集合和欄位。變更會立即生效——內容 API、loader 和編輯介面都在執行階段從資料庫讀取結構描述。
可用的欄位類型、驗證規則和小工具選項請參閱集合和欄位。
變更結構描述後,請重新產生範本所使用的 TypeScript 型別。emdash types 指令從執行中的實例讀取結構描述,因此可以直接指向已部署的站台:
npx emdash types --url https://example.com
透過 CLI 變更結構描述
emdash schema 指令透過 REST API 與執行中的實例通訊,因此它們對已部署站台的作用與對本機開發的作用相同。請先用裝置流程(device flow)驗證一次:
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 檔案。按照建立異地 D1 傾印中的說明建立 SQL 檔案,將資料表和資料列載入到本機資料庫,然後匯出種子:
sqlite3 prod.db < backup-schema.sql
sqlite3 prod.db < backup-folders.sql
sqlite3 prod.db < backup-data.sql
npx emdash export-seed --database prod.db > .emdash/seed.json
匯出的種子包含線上站台的設定、集合、分類法、選單、重新導向、小工具區域和 Section。加入 --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 設定繼承。 -
按照建立異地 D1 傾印中的說明,從正式環境建立 SQL 檔案,然後透過預覽環境的
DB繫結按順序匯入它們:npx wrangler d1 execute DB --env preview --remote --file=./backup-schema.sql npx wrangler d1 execute DB --env preview --remote --file=./backup-folders.sql npx wrangler d1 execute DB --env preview --remote --file=./backup-data.sql npx wrangler d1 execute DB --env preview --remote --file=./backup-indexes.sql預覽站台會在首次呼叫搜尋 API 時重建其搜尋索引,如該節所述。
-
建置專案,將其部署到預覽環境,然後針對預覽 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 的時間點備份中還原,或者重新新增該欄位,並從較早的異地 D1 傾印中還原其值。
- 新環境以錯誤的模型完成了引導。 嵌入的種子已過時或遺失。請更新
.emdash/seed.json(參閱保持種子檔案同步),重新建置,並將部署指向一個空資料庫以再次引導。 - 結構描述與範本不一致。 部署與結構描述變更相互獨立,因此請有意識地安排它們的順序:增量式的結構描述變更(新集合、新的選填欄位)先進行,然後再部署使用它們的程式碼。對於移除操作,請先部署不再使用該欄位的程式碼,然後再移除該欄位。