Migration ของฐานข้อมูล
คู่มือนี้ครอบคลุมฐานข้อมูลของ CMS เอง: ประวัติ schema อยู่ที่ไหน วิธีเปลี่ยน schema และวิธี apply การเปลี่ยนแปลงกับฐานข้อมูล local, ฐานข้อมูลที่ deploy แล้ว และฐานข้อมูลรายไซต์ทั้งหมด รันทุกคำสั่ง จาก root ของ repository
อะไรอยู่ที่ไหน
หัวข้อที่มีชื่อว่า “อะไรอยู่ที่ไหน”| Path | คืออะไร |
|---|---|
backend/prisma/migrations/ |
SQL migration ของ Prisma หนึ่งไดเรกทอรีต่อหนึ่ง migration 20260908000000_init คือ baseline สำหรับการติดตั้งใหม่: schema ทั้งหมดและแถว seed เป็นแหล่งอ้างอิงหลัก ของประวัติ schema รวมถึง constraint ที่กำหนดเองและแถว seed ที่จำเป็น |
backend/migrations-wrangler/ |
mirror สำหรับ D1 ของ migration เหล่านั้น (0001_init.sql สำหรับ baseline แล้วหนึ่งไฟล์ต่อ migration ถัดไปแต่ละรายการ) เป็นไฟล์ที่สร้างขึ้น — ห้ามแก้ด้วยมือ Wrangler apply ไฟล์เหล่านี้กับ D1 |
backend/prisma/prod.prisma, local.prisma, site.prisma, eav.prisma, tables.prisma |
ชิ้นส่วน (fragment) ของ schema ให้แก้ไฟล์เหล่านี้ |
backend/prisma/schema.prisma |
ประกอบจาก prod.prisma + site.prisma + eav.prisma + tables.prisma โดย scripts/build-prisma-schema.mjs ไฟล์นี้ถูก check in แต่เป็นผลลัพธ์: การแก้ไขโดยตรงจะถูกเขียนทับในการ build ครั้งถัดไป |
backend/prisma/schema.local.prisma |
การประกอบแบบเดียวกันบนฐาน local.prisma ใช้ตอนเขียน migration อยู่ใน gitignore |
backend/tenant-migrations/ |
schema ที่ฐานข้อมูลรายไซต์ใหม่ใช้เริ่มต้น (0001_tenant_schema.sql) บวกกับ delta ใน deltas/ ที่พาฐานข้อมูลรายไซต์ที่มีอยู่ไปข้างหน้า ตอนนี้ยังไม่มี delta เกี่ยวข้องเฉพาะเมื่อคุณใช้ npm run provision:site |
หลังรีลีสแรก Migration เพิ่มต่อท้ายได้อย่างเดียว ห้ามแก้หรือลบ migration ที่เผยแพร่แล้ว ให้แก้ด้วย migration ใหม่
ก่อนรีลีสแรก
หัวข้อที่มีชื่อว่า “ก่อนรีลีสแรก”Dee Wan ยังไม่ได้รีลีส จึงยังไม่มีการติดตั้งที่ต้องย้ายตาม ก่อนรีลีสแรก การเปลี่ยน schema
จะแก้ baseline แทนการเพิ่ม migration ใหม่: fragment, 20260908000000_init, mirror 0001_init.sql
และ baseline ของเว็บไซต์ 0001_tenant_schema.sql เปลี่ยนไปพร้อมกัน และ npm run migrate:check,
npm run prisma:drift กับ npm run tenant:schema:check ต้องผ่าน
รีลีสแรกเริ่มจากฐานข้อมูลใหม่ทั้งหมด ไม่มี SQL สำหรับอัปเกรดฐานข้อมูลที่ build ก่อนหน้าสร้างไว้ และไม่มี delta
ของเว็บไซต์ การแก้ baseline ทำให้ tenant schema เปลี่ยนโดยไม่มี delta ใหม่ ดังนั้น npm run tenant:schema จะปฏิเสธ
ให้สร้างใหม่ด้วย npm run tenant:schema -- --allow-no-delta หลังรีลีสแรก การเปลี่ยน schema ทุกครั้งคือ
migration ใหม่ ตามขั้นตอนด้านล่าง
ฐานข้อมูลในเครื่องที่สร้างจาก baseline เก่าจะไม่ได้รับการเปลี่ยนแปลงนี้ ให้สร้างใหม่: หยุดสภาพแวดล้อมในเครื่อง
ลบ backend/.wrangler/state แล้วรัน npm run local:migrate และ npm run local:seed อีกครั้ง
การทำเช่นนี้จะลบเว็บไซต์ รายการ และไฟล์ที่อัปโหลดในเครื่องทั้งหมด
เปลี่ยน schema
หัวข้อที่มีชื่อว่า “เปลี่ยน schema”ก่อนรีลีสแรก ให้อัปเดต baseline ตามที่อธิบายไว้ด้านบน ขั้นตอนด้านล่างใช้หลังรีลีส
-
แก้ fragment ที่มี model นั้น (
site.prisma,eav.prismaหรือtables.prisma) -
build
schema.prismaและ Prisma client ใหม่:หน้าต่างเทอร์มินัล npm run prisma:generate -
apply ทุกอย่างที่มีอยู่แล้วกับฐานข้อมูล local ของคุณ แล้วเขียน migration ใหม่:
หน้าต่างเทอร์มินัล npm run local:migratenpm run local:migrate -- initial --create-migrationการเขียน migration ปิดอยู่จนกว่าคุณจะส่ง
--create-migrationดังนั้นการ apply ปกติจะไม่เขียน migration จาก schema ที่ drift ไปแล้ว เมื่อส่ง flag นี้ และเฉพาะเมื่อไม่มีอะไรเหลือให้ apply บน local คำสั่งจะรันprisma migrate dev --create-onlyซึ่งเขียนไดเรกทอรีใหม่ใต้backend/prisma/migrations/แล้ว apply migration นั้นกับฐานข้อมูล local คำสั่งใช้ config local ที่ถูก track ไว้ (backend/wrangler.dev.jsonc) จึงใช้ได้บน clone ที่ไม่เคย ติดตั้งให้คงคำว่า
initialไว้ในคำสั่งนั้น ปัจจุบัน--create-migrationที่ส่งมาเดี่ยว ๆ จะถูกปฏิเสธ พร้อมข้อความวิธีใช้ -
อ่าน SQL ที่สร้างขึ้นก่อน commit migration ที่เขียนจาก schema ซึ่ง drift ไปจากฐานข้อมูล อาจมีคำสั่ง
DROP TABLEที่ไม่มีใครตั้งใจ -
สร้าง mirror สำหรับ D1 ใหม่และตรวจผล:
หน้าต่างเทอร์มินัล npm run migrate:sync # writes backend/migrations-wrangler/ from the Prisma migrationsnpm run migrate:check # fails if the mirror and the migrations disagreenpm run prisma:drift # fails if schema.prisma no longer describes what the migrations build -
หากคุณใช้ฐานข้อมูลรายไซต์ ให้สร้าง schema ของมันใหม่ด้วย:
หน้าต่างเทอร์มินัล npm run tenant:schema # rewrites the per-site bootstrap schemanpm run tenant:schema:check # fails until every new table has a placementmigration ที่เพิ่มตารางจะไม่ผ่าน
tenant:schema:checkจนกว่าตารางนั้นจะถูกจัดวาง (placement) ในbackend/src/lib/tenancy/placement.tsmigration ที่เปลี่ยนสิ่งที่ฐานข้อมูลรายไซต์ที่มีอยู่เก็บไว้ต้องมี delta ด้วย เขียน SQL ที่พาฐานข้อมูลแบบนั้นไปข้างหน้า เป็น
backend/tenant-migrations/deltas/NNNN_<name>.sqlด้วยหมายเลขถัดไป ก่อนรันnpm run tenant:schemaสำหรับคอลัมน์หรือ index ที่เพิ่ม นี่คือ SQL ของ migration เองnpm run tenant:schemaปฏิเสธ tenant schema ที่เปลี่ยนไปโดยไม่มี delta ใหม่ และบอกชื่อไฟล์ที่ต้องเขียน ใช้--allow-no-deltaเฉพาะเมื่อการเปลี่ยนนั้นไม่ต้องมี delta -
commit Prisma migration, ไฟล์ mirror ของมัน, delta ใด ๆ และการเปลี่ยน tenant schema ใด ๆ ไปพร้อมกัน
Apply migration
หัวข้อที่มีชื่อว่า “Apply migration”| ที่ไหน | คำสั่ง | หมายเหตุ |
|---|---|---|
| local rig (ไม่มีบัญชี Cloudflare) | npm run local:migrate |
ใช้ backend/wrangler.dev.jsonc ซึ่งทุก clone มี ไม่ต้องใช้ credential |
| mirror local ของการตั้งค่าที่ติดตั้งแล้ว | npm run migrate:d1:local |
อ่าน backend/wrangler.jsonc ซึ่ง setup เขียนและ git ละเว้น จึงล้มเหลวบน clone ที่ยังไม่ได้ติดตั้ง ใช้คู่กับ npm run dev:install --workspace backend |
| ฐานข้อมูลควบคุมที่ deploy แล้ว | npm run migrate:d1 |
ต้องมี CLOUDFLARE_API_TOKEN พิมพ์ config และฐานข้อมูลที่กำลังจะ migrate ก่อนรัน เพิ่ม -- --config <file> สำหรับการติดตั้งที่ไม่ใช่ backend/wrangler.jsonc |
| ฐานข้อมูลรายไซต์ที่มีอยู่ | npm run tenant:upgrade |
เฉพาะเมื่อคุณเคยรัน npm run provision:site -- --plan แสดงว่าแต่ละไซต์ขาดอะไรโดยไม่เขียน |
การติดตั้งใหม่ไม่ต้องใช้คำสั่งเหล่านี้เลย: npm run setup apply schema เอง
npm run deploy ปฏิเสธการ deploy admin Worker ขณะที่ฐานข้อมูลควบคุมมี migration ค้างอยู่
หรือเมื่อมันบอกไม่ได้ ให้ apply ก่อน --skip-migration-check ข้ามการตรวจนี้
ใช้เฉพาะเมื่อคุณรู้ว่าโค้ดใหม่ไม่ขึ้นกับ migration ที่ค้างอยู่
เมื่อ migration ล้มเหลว
หัวข้อที่มีชื่อว่า “เมื่อ migration ล้มเหลว”- migration ถูก apply ตามลำดับ และแต่ละตัวถูกบันทึกว่า apply แล้วหลังจากสำเร็จเท่านั้น ความล้มเหลวจะหยุดการรันและบอกว่า migration นั้นไม่ได้ถูกบันทึก migration ที่ตามมาจะไม่ถูก apply แก้สาเหตุแล้วรันคำสั่งเดิมอีกครั้ง: มันจะลอง migration ที่ล้มเหลวใหม่
- หาก migration หยุดกลางทาง การลองใหม่จะรันทีละ statement และข้ามเฉพาะ statement ที่ตาราง,
index, trigger หรือคอลัมน์ของมันมีอยู่แล้ว จึงทำให้จบได้ migration ที่มีบล็อก
BEGIN … ENDที่ไม่ใช่ trigger แยกแบบนั้นไม่ได้ การรันจะปฏิเสธและระบุชื่อมัน และคุณต้องแก้ schema ด้วยมือ ก่อนรันอีกครั้ง - อย่าแก้ migration ที่ล้มเหลวด้วยการแก้ migration ที่ถูก apply ที่ใดที่หนึ่งไปแล้ว ให้เพิ่ม
migration ใหม่ที่แก้ไขมัน รัน
migrate:syncแล้ว apply อีกครั้ง - ก่อน apply migration ที่มีความเสี่ยงกับฐานข้อมูลที่ deploy แล้ว ให้ export ไว้ก่อน:
npx wrangler d1 export <database-name> --remote --output backup.sqlจากbackend/Cloudflare D1 ยังเก็บประวัติแบบ point-in-time ของตัวเอง (Time Travel) ซึ่งกู้ฐานข้อมูลกลับไปยัง ช่วงเวลาก่อน migration ได้ - หาก
npm run deployปฏิเสธเพราะมี migration ค้างอยู่ ให้ apply ด้วยnpm run migrate:d1แทนการข้ามการตรวจ
ยังไม่เปิดตัว (pre-MVP) และยังไม่มีเวอร์ชันเสถียร
คอมมิตซอร์สโค้ด: e207e63239a627fbd2ae9c414ef7c6eb19fcfe5a (มีการแก้ไขที่ยังไม่คอมมิต)
วันที่สร้างเอกสาร (UTC): 2026-10-21T09:28:24.214Z
คอมมิตสำหรับอัปเกรด: ระบุไม่ได้: มีการแก้ไขที่ยังไม่คอมมิต. บันทึกการเปลี่ยนแปลง