wrangler d1 export my-db --remote --output backup.sql # 必ず先にバックアップwrangler d1 execute my-db --remote --file migrations/rollback/0006_bilingual_posts.down.sql# 再適用できるようにマイグレーション記録も消すwrangler d1 execute my-db --remote \ --command "DELETE FROM d1_migrations WHERE name = '0006_bilingual_posts.sql'"
原則2: マイグレーションは冪等に書く
途中失敗や再実行に備えて、何度流しても壊れないSQLにします:
sql
-- カラム追加はDEFAULT付きで(既存行が壊れない)ALTER TABLE posts ADD COLUMN title_en TEXT DEFAULT '';-- 初期データ埋めは「空のときだけ」UPDATE posts SET title_en = CASE WHEN title_en = '' THEN title ELSE title_en END;-- バックフィルはNOT EXISTSで二重登録防止INSERT INTO posts_fts(rowid, title) SELECT rowid, title FROM postsWHERE NOT EXISTS (SELECT 1 FROM posts_fts WHERE posts_fts.rowid = posts.rowid);
原則3: DROP COLUMNの罠を知っておく
SQLite(D1)の ALTER TABLE ... DROP COLUMN は、そのカラムをトリガー・ビュー・インデックスが参照していると失敗します。ロールバックSQLを書くときは、対象カラムがFTS同期トリガーなどから参照されていないか先に確認します。
Turnstile site key が未設定のため、このフォームは送信できません。管理者は NEXT_PUBLIC_TURNSTILE_SITE_KEY を設定してください。