ผมเชื่อว่าหลายๆคนยังสับสนกับการใช้ Migration บน Laravel framework กันอยู่ บทความนี้เราจะมาขยายความถึงการใช้งานจริงๆบน Production กันครับ
ก่อนเริ่มอธิบายขอเกริ่นคร่าวๆก่อนว่า Migration คือ Package ที่ช่วยเราสร้าง Schema (โครงสร้าง Table) เพื่อให้ง่ายต่อการพัฒนาเป็นทีม ยกตัวอย่าง ผมกำลังเขียน code อยู่อยากเพิ่ม Field ในฐานข้อมูลซักอัน
ผมคงจะไม่ทัก chat ไปหาทีมแล้วบอกว่าเห้ยทุกคนสร้าง Field user_id ในตาราง orders ด้วยนะอย่าลืมละ ใครลืมรัน code ล่าสุดไม่ได้นะ…..
Itthipat เคยทำ 555+ สมัยหนุ่มๆ
เราแค่ใช้ Migration สร้างฐานข้อมูลให้เรา แล้วเราก็นัดเพื่อนๆในทีมว่า ทุกครั้งก่อนเริ่มทำงานอย่าลืมรันคำสั่ง php artisan migrate เท่านี้เป็นอันเรียบร้อยทุกคนได้หน้าตา table เหมือนกันชัวร์
Migration มีผลกระทบบน Production ยังไง
ก็เจ้าตัว migrate ดันมีคำสั่ง refresh, fresh, rollback เพื่อรอลบฐานข้อมูลอันมีค่าของเราอยู่ตลอดเวลา แล้วเราจะเอาไปใช้บน production ได้ยังไงมันก็ทำข้อมูลหายทั้งเว็บสิ!! เอาละมาดู Flow กัน
ปกติแล้วเวลาที่เรา dev ในเครื่องเนี่ยมันจะมีกรณีที่ database ผิด หรือ การสร้างผิดพลาดเราอยากแก้ Field ใหม่ทั้งหมดและไม่อยากเก็บข้อมูลที่เรา insert ลง db มั่วๆไว้ในตอนที่เราทดสอบ เราจะใช้คำสั่ง
artisan migrate:fresh หรือ artisan migrate:refresh
มันจะเป็นการลบ table ทิ้งและสร้างให้ใหม่ หรืออาจจะใช้ในกรณีที่ ก่อนขึ้น production เราต้องเคลียร์ฐานข้อมูลให้ใสสะอาดก็จะใช้คำสั่งข้างต้น
แต่! เมื่อขึ้น production แล้วเราจะไม่ใช้คำสั่งเหล่านี้เพราะมันคือการทำลายข้อมูลใน database ทั้งหมดแล้วสร้างตารางเปล่าๆ เรียกว่าบรรลัยจนแทบจะลาออกจากบริษัทเลย ถ้าไม่มี backup
แล้วตอน production จะทำยังไง ?
เราจะใช้คำสั่ง artisan migrate เท่านั้นครับ
artisan migrate
เพราะเราต้องการแก้ไข table เท่านั้นและเราไม่ต้องการลบข้อมูลของฐานข้อมูล แต่มีเทคนิคนึงที่หลายๆคนมองข้ามคือการตั้งค่าไฟล์ .env
ป้องกันการรันคำสั่ง
เราจะป้องกันการรันคำสั่งแบบนี้ได้ยังไง คำตอบคือในไฟล์ .env ของ project จะมีตัวแปร APP_ENV=local เมื่อไหร่ที่เราเปลี่ยนเป็น APP_ENV=production เราจะไม่สามารถรันคำสั่ง migrate ได้เลย มันจะขึ้นแจ้งเตือนว่าตอนนี้คุณอยู่บน production นะรันไม่ได้ แต่ถ้าต้องการรันเราจะใส่คำสั่ง –force เช่น
artisan migrate --force
เพื่อบอกให้ app เราทำการ migrate บน production ครับ ระบบจะทำการอ่านไฟล์ migrate แล้วแก้ไขหรือสร้าง table ให้เราบน production เองซึ่งการตั้งค่า APP_ENV ก็เป็นตัวช่วยป้องกันความผิดพลาดของเราในระดับนึง เพราะฉะนั้นจงมีสติก่อนพิมพ์คำสั่งครับ
ป.ล.
สุดท้ายแล้วก็อย่าไปรัน artisan migrate:fresh –force ละกันตัวใครตัวมันบอกเลย 555
วีดีโอเรื่องการใช้งาน Migration ครับ