loader

Codeigniter Migration: Versioning Database

Per “migration” s’intende le gestione delle varie versioni di un database. Grazie al concetto di migration possiamo effettuare tutte le operazioni sul database che abitualmente effetuiamo con strumenti come phpMyAdminToadMySQL Workbench e simili.

La cosa interessante è che invece di utilizzare uno di questi strumenti per creare una tabella oppure aggiornare un campo, basterà scrivere la nostra migration sotto forma di classe PHP ed eseguirla.

Codeigniter, come altri framework più blasonati, mette a disposizione una Libreria, appunto Migration, che consente allo sviluppatore di mutuare e alterare nel tempo la struttura del database con semplici passaggi.

La prima cosa da capire è la separazione logica delle nostre tabelle, in modo tale da attuare correzioni e implementazioni corrette.

Migrations Class, ossia la Libreria di Codeigniter per effettuare le migration, è tanto semplice quanto complessa, vediamo subito alcuni passaggi per approcciare questo strumento.

  • Nome della Migration
  • Creazione Migration
  • Configurazione delle Migrations

Partendo dall’ultimo punto, “Configurazione delle Migrations” possiamo istruire Codeigniter ad utilizzare la nostra logica, quindi magari è possibile alterare la memorizzazione dei file semplicemente utilizzando una sequenza numerica invece del timestamp.

Creazione di una Migration

Strutturata la nostra applicazione, dovremo creare i nostri file all’interno della directory configurata in migration.php ($config[‘migration_path’]), che solitamente è application/migrations/, rinominare il file sequenzialmente e/o con timestamp in base alla configurazione.

  • Creazione file con timestamp: 20191107000000_test_migration.php
  • Creazione file sequenziale: 001_test_migration.php

Vediamo a questo punto come strutturare il nostro file:

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

class Migration_test extends CI_Migration {

        public function up()
        {
                $this->dbforge->add_field(array(
                        'id' => array(
                                'type' => 'INT',
                                'unsigned' => FALSE,
                                'auto_increment' => TRUE
                        ),
                        'name' => array(
                                'type' => 'VARCHAR',
                                'constraint' => '100',
                        ),
                        'description' => array(
                                'type' => 'TEXT',
                                'null' => TRUE,
                        ),
                ));
                $this->dbforge->add_key('id', TRUE);
                $this->dbforge->create_table('test');
        }

        public function down()
        {
                $this->dbforge->drop_table('test');
        }
}

Vediamo che all’interno della migration abbiamo 2 metodi, uno UP e l’altro down, che rispettivamente indicano a codeigniter l’azione in caso di migration successiva o precedente.

Infatti se la current version di migration è la 0, e creiamo una nuova migration 001 , eseguendo il codice, codeigniter lancerà il metodo up del nostro file 001_test_migration.php, al contrario utilizzerà il metodo down per tornare ad una versione precedente.

Conclusioni e riflessioni

L’utilizzo di un sistema di migration porta con se molti vantaggi e sopratutto una nuova tecnica per la gestione dei database.

Prima del concetto di migration, la gestione del database era separata dal nostro framework. L’aggiunta di un campo in una tabella era una procedura totalmente manuale, utilizzando ad esempio phpMyAdmin.

Questo comportava spesso errori e soprattutto perdita di tempo. Pensate di dover aggiungere lo stesso campo in una tabella su 20 Ecommerce diversi già in produzione. Operazione lunga e rischiosa.

L’utilizzo di uno strato software per automatizzare questo tipo di operazione, sarà tutto più semplice, sicuro e manutenibile.

Non dovremo collegarci 20 volte su phpMyAdmin per aggiungere il nuovo campo, ma basterà generare la nostra migration, testarla ed eseguirla. Magicamente tutti i nostri database saranno aggiornati alle ultime migration eseguite