EmDash はコレクション、フィールド、タクソノミーをコンテンツと共にデータベースに保存します。このガイドを使用して、コードデプロイ、初回シーディング、EmDash コアマイグレーションと混同せずに、稼働中のコンテンツモデルを変更してください。例では Cloudflare D1 を使用していますが、同じ分離はすべてのデータベースアダプターに適用されます。
何が何を変更するか
サイトは 4 つの異なるワークフローを経ます。それぞれが異なるレイヤーに影響します:
| ワークフロー | 何が変わるか | 方法 |
|---|---|---|
| コンテンツ編集 | エントリ、メディア、設定 | 管理パネルまたはコンテンツ API |
| コードデプロイ | テンプレート、設定、EmDash バージョン | wrangler deploy — EmDash 管理のデータベーステーブルをマイグレーションする場合あり |
| 初回ブートストラップ | すべて(空の状態から) | マイグレーション + シードファイル + セットアップウィザード、初回起動時に自動 |
| スキーマ進化 | コレクション、フィールド、タクソノミー | 管理パネルまたは emdash schema を稼働サイトに対して実行(このページ) |
シードファイルは 3 行目のみに関与します。データベースが空でセットアップウィザードが完了していない場合に一度だけ適用されます。変更されたシードファイルを既存のデータベースに対してデプロイしても何も起こりません — 稼働サイトのスキーマの進化は常に管理パネルまたは 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
または、管理画面の 設定 → 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 リファレンスを参照してください。
シードファイルを同期する
ビルドに埋め込まれたシードファイルは、新しいデータベースが何で初期化されるかを決定します:新しいプレビュー環境、災害復旧の再構築、または同じサイトの 2 回目のデプロイメント。シードがまだスターターブログを記述しているのに本番が別のものに進化している場合、すべての新しい環境が間違ったモデルでブートストラップされます。
ビルドは .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-configenv.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を更新し(シードファイルを同期するを参照)、再ビルドして、空のデータベースに対してデプロイして再度ブートストラップします。 - スキーマとテンプレートが一致しない。 デプロイとスキーマ変更は独立しているため、意図的に順序付けてください:追加的なスキーマ変更(新しいコレクション、新しいオプションフィールド)を最初に、次にそれらを使用するコードを。削除の場合は、まずフィールドの使用を停止するコードをデプロイし、次にフィールドを削除します。