การทำงานกับ Migration ของ Codeigniter

Migration ใน Codeigniter คือวิธีอันสะดวกสบายง่ายดายที่จะใช้ในการปรับปรุงโครงสร้างฐานข้อมูลตามรุ่นต่างๆ ให้ตรงกับเวอร์ชั่นของการทำงาน สำหรับเอกสารอ้างอิง โปรดคลิกที่ลิ้งค์นี้ (จะดีมากๆหากเปิดเอกสารอ้างอิงไปด้วย ทดลองทำตามไปด้วย)

การเปิดใช้งาน Migration

ให้ไปที่ folder application/config/migration.php ปรับค่า $config['migration_enabled'] = true; จากนั้นก็ปรับเลขรุ่น โดยเรียงตามลำดับเท่านั้น
ในตัวอย่างนี้ขอให้ปรับไปที่ 1

สร้างไฟล์ Migration

สร้างไฟล์ตามเลขรุ่น โดยมีตัวเลข 3 หลัก เช่น รุ่น 1 ก็เป็น 001 รุ่น 99 ก็เป็น 099 แล้วตามด้วยชื่อที่จะต้องไม่ซ้ำกันเมื่อตัดเอาตัวเลขออกไปแล้ว
ในกรณีตัวอย่างนี้ สร้างไฟล์ชื่อ 001_update.php ข้างใน folder application/migrations/ (หากไม่มีต้องสร้างโฟลเดอร์ขึ้นมาใหม่) แล้วทดลองใส่โค้ดตามตัวอย่าง


<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Migration_Update extends CI_Migration {
    
    
    public function up()
    {
        $this->db->query( 
            'CREATE TABLE IF NOT EXISTS `prefix_test` (
                `id` int(11) NOT NULL AUTO_INCREMENT,
                PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;' 
        );
    }// up
    
    
    public function down()
    {
        $this->db->query('DROP TABLE `prefix_test`');
    }// down
    
    
}

รันไฟล์ Migration

จากเอกสารอ้างอิง จะพบว่ามีคำสั่งต่างๆ เช่น
$this->migration->current(); $this->migration->latest(); $this->migration->version();

โดย current() จะรันตามเลขรุ่นปัจจุบันที่กำหนดในไฟล์ application/config/migration.php
latest() จะรันตามเลขรุ่นมากสุดโดยไม่สนใจเลขรุ่นปัจจุบันตามไฟล์ดังกล่าว
และ version() จะใส่ตัวเลขรุ่นลงใน version(x) เพื่อรันตามเลขรุ่นที่กำหนดเท่านั้น.

ในตัวอย่างนี้ขอให้ใช้ current() เพื่อรันตามเลขรุ่นที่กำหนดในไฟล์ application/config/migration.php


$this->load->library('migration');
$this->migration->current();


โดยขอให้ใส่โค้ดข้างบนนี้ลงใน controller ใด controller หนึ่งแล้วเรียกใช้งาน เช่น controller test method index() ก็เรียกไปยัง http://domain/test/

ผลการรันไฟล์ Migration

เมื่อทดลองรันผ่านแล้วไม่มี error ใดๆ เมื่อเปิดดูในฐานข้อมูล จะพบตาราง migrations ซึ่งสร้างโดย Codeigniter และข้างในจะมีเลขเวอร์ชั่น 1 อยู่
และนอกจากนี้จะพบตาราง prefix_test ถูกสร้างไว้ ถือว่าทำงานอัพรุ่นตาม Migration ถูกต้อง

ทดลอง Revert version

เมื่ออัพรุ่นเวอร์ชั่นสำเร็จแล้ว ลองมาลดเวอร์ชั่นปัจจุบันกันบ้าง แก้ไฟล์ application/config/migration.php โดยกำหนดรุ่นให้เป้น 0 แล้วเรียกไปยัง http://domain/test/

หากไม่พบ error ใดๆ เมื่อเปิดฐานข้อมูลดู ควรจะพบว่าตาราง prefix_test ถูกลบออกไปแล้ว ตามคำสั่ง method down() ในไฟล์ Migration 001_update.php

ข้อจำกัดของ Codeigniter Migration

  1. สามารถรันเวอร์ชั่นสูงสุดได้แค่ 999 เท่านั้น
  2. ไม่ว่าจะต่างเลขเวอร์ชั่นกันอย่างไร ชื่อไฟล์เมื่อตัดเลขเวอร์ชั่นออกแล้วต้องไม่ซ้ำกัน เช่น 001_update กับ 002_update อย่างนี้ไม่ได้ แต่ 001_update กับ 002_update2 อย่างนี้ได้ และต้องกำหนด class ให้ถูกต้องตามชื่อ
  3. ไม่สามารถสร้าง migration version ข้ามเลขได้ เช่น มีไฟล์ 001_update จะข้ามไป 003_update3 เลยไม่ได้ จะต้องมีไฟล์ที่มีเลขเวอร์ชั่นไล่ลำดับกันเท่านั้น
  4. ไม่สามารถสร้างไฟล์ต่อรุ่นเวอร์ชั่นได้มากกว่า 1 เช่น คุณจะสร้าง 002_update_category.php 002_update_post.php อย่างนี้ไม่ได้ ไม่ว่าจะอัพเดทโครงสร้างฐานข้อมูลกี่ตารางมากน้อยแค่ไหน ถ้าไม่ยัดลงไฟล์เดียว ก็แยกออกเป็นหลายรุ่นเท่านั้น

หวังว่าบทความนี้จะเป็นประโยชน์กับทุกท่าน อย่างน้อยก็จะได้ช่วยเตือนความจำหรือได้เห็นขีดจำกัดที่ท่านอาจยังไม่ทราบ เพราะในเอกสารของ Codeigniter ไม่มีบอกไว้ 🙂

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>