How to migrate laravel on Production

ผมเชื่อว่าหลายๆคนยังสับสนกับการใช้ 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 ครับ

บทความที่เกี่ยวข้อง

เกี่ยวกับผู้เขียน

Itthipat Thitsarak

สวัสดีครับผม อิทธิพัทธ์ (เป้) เป็น Freelance Web developer ชอบหาเทคนิคต่างๆที่ทำให้ชีวิต Programmer ง่ายขึ้นโดย Blog นี้จะ สอน Laravel, Vuejs, CSS, HTML 5 และอื่นๆ ที่เกี่ยวกับการทำเว็บไซต์

ขอบคุณทุกคนที่ติดตาม และอ่านบทความของผมครับ หากใครมีคำถามหรืออยากให้ผมเขียนเกี่ยวกับเรื่องอะไรเพิ่มเติม สามารถแสดงความคิดเห็นไว้ที่ใต้บทความ หรือส่งเรื่องเข้ามาที่ Email ได้เลยครับ หัวข้อไหนน่าสนใจ ผมจะหยิบมาเขียนบทความให้ได้อ่านกันเรื่อยๆครับ

Scroll to Top
Scroll to Top