author Ahmad Muhardian

Panduan Migrasi Database Menggunakan PHP Phinx


Php Phinx

Migrasi bisa diatrikan berpindah ke platform yang satu ke platfrom yang lain.

Dalam pengembangan web migrasi adalah hal yang wajib dilakukan.

Misalnya:

Saat aplikasi web sudah jadi dan siap untuk di-hosting, apa yang akan kita lakukan berikutnya?

Ya jelas, kita akan melakukan migrasi (deployment) dari lingkungan localhost ke server production/hosting.

Biasanya migrasi secara tradisional dilakukan dengan:

  1. Ekspor database;
  2. Upload proyek ke server production (hosting);
  3. Impor database ke server production.

Tapi masalahanya…

“Bagaimana kalau database yang digunakan di server hosting berbeda dengan database lokal?”

Misalnya pada saat pengembangan di localhost, kita menggunakan MySQL. Sedangkan di server hosting menggunakan PostgerSQL.

Kita bisa saja mengubah hasil ekspor (dump) dari MySQL ke PostgerSQL.

“Lalu, bagaimana kalau sudah ada data di dalam server hosting?”

Nah ini perlu dipikirkan lagi… Kerja lagi 😠.

Oleh sebab itu, kita disarankan menggunakan database migration tools agar kita tidak repot dalam mengurus migrasi database.

Beberapa framework seperti Yii dan Laravel sudah menyediakan tool tersendiri untuk migrasi database.

Bila proyekmu menggunakan PHP Native, kamu bisa menggunakan beberapa tools seperti Phinx.

Pada panduan ini kita akan belajar menggunakan Phinx, yang merupakan salah satu tools migrasi database terpopuler untuk PHP.

Apa itu Phinx?

Phinx adalah tool migrasi database berbasis PHP yang dibuat oleh Rob Morgan.

Phinx akan membantu kita memanipulasi database dengan mudah, sehingga kita tidak lagi menulis skema SQL secara manual.

Saat tulisan ini dibuat, Phinx masih versi 0.8.0.

Instalasi Phinx ke dalam Proyek

Phinx dapat kita instal melalui composer.

Sebelumnya kita persiapkan dulu proyeknya.

Silahkan buat direktori baru bernama my-php-project:

mkdir my-php-project
cd my-php-project

Setelah itu install Phinx melalui composer:

composer require robmorgan/phinx --dev

Tunggulah beberapa saat, Phinx akan segera terinstal.

Kenapa kita menggunakan --dev?

Pertanyaan bagus.

Karena Phinx hanya akan kita gunakan untuk development saja, Phinx tidak akan digunakan oleh aplikasi di lingkungan production.

Setelah Phinx berhasil terinstal, akan ada file composer.json, composer.lock, dan direktori vendor.

{
    "require-dev": {
        "robmorgan/phinx": "^0.8.1"
    }
}

Menyiapkan Phinx

Phinx membutuhkan direktori db untuk menyimpan skrip migrasinya.

Silakan buat direktori baru:

mkdir -p db/{migrations,seeds}

Maka akan terbuat struktur direktori seperti ini:

db
├── migrations
└── seeds

Direktori migrations digunakan untuk menyimpan skema migrasi, sedangkan seeds digunakan untuk menyimpan bibit data.

Langkah selanjutnya adalah mengeksekusi file binary Phinx yang berada di vendor/bin/phinx.

Kita akan selalu mengeksekusi file tersebut setiap kali kita melakukan migrasi.

Pertama, silahkan persiapkan Phinx dengan perintah berikut ini:

php vendor/bin/phinx init

Pertinah tersebut akan membuat file baru bernama phinx.yml yang berisi konfigurasi Phinx.

paths:
    migrations: %%PHINX_CONFIG_DIR%%/db/migrations
    seeds: %%PHINX_CONFIG_DIR%%/db/seeds

environments:
    default_migration_table: phinxlog
    default_database: development
    production:
        adapter: mysql
        host: localhost
        name: production_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

    development:
        adapter: mysql
        host: localhost
        name: development_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

    testing:
        adapter: mysql
        host: localhost
        name: testing_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

version_order: creation

Pada file tersebut berisi konfigurasi direktori dan koneksi database yang akan digunakan oleh Phinx.

Lokasi file migrasi Phinx:

paths:
    migrations: %%PHINX_CONFIG_DIR%%/db/migrations
    seeds: %%PHINX_CONFIG_DIR%%/db/seeds

Ada tiga Environment dalam konfigurasi Phinx:

  1. production untuk server hosting.
  2. development untuk server lokal (localhost).
  3. testing untuk server testing.

Untuk saat ini kita gunakan yang development saja.

Silahkan buat database baru.

Membuat database baru untuk Phinx

Setelah itu, ubah konfigurasinya sesuai dengan nama databasenya.

paths:
    migrations: %%PHINX_CONFIG_DIR%%/db/migrations
    seeds: %%PHINX_CONFIG_DIR%%/db/seeds

environments:
    default_migration_table: phinxlog
    default_database: development
    production:
        adapter: mysql
        host: localhost
        name: production_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

    development:
        adapter: mysql
        host: localhost
        name: my_php_project
        user: root
        pass: 'kopi'
        port: 3306
        charset: utf8

    testing:
        adapter: mysql
        host: localhost
        name: testing_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

version_order: creation

Setelah itu, silahkan lakukan verifikasi konfigurasi dengan perintah:

vendor/bin/phinx test

Apabila hasilnya sukses, berarti konfigurasi kita benar.

Hasil test konfigurasi phinx

Membuat Kode Migrasi

Selanjutnya kita akan menulis kode migrasi.

Silahkan buat migrasi dengan perintah:

vendor/bin/phinx create User

Artinya, kita akan membuat migrasi untuk tabel User.

Pastikan menggunakan huruf besar di awalnya, karena akan digunakan sebagai nama class pada kode migrasi.

Membuat Migrasi User

Setelah berhasil mengeksekusi perintah tersebut, akan ada file baru di direktori db/migrations.

<?php

use Phinx\Migration\AbstractMigration;

class User extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {

    }
}

Terdapat method change() di dalam class User, di sana lah kita akan menulis kode migrasi.

Selain itu ada juga method up() dan down().

Apa fungsinya?

  • Method up() akan dieksekusi ketika kita melakukan migrasi ke server (membuat tabel).
  • Method down() akan dieksekusi saat kita melakukan rollback (mengancurkan tabel).
  • Method change() kedua-duanya, ketika migrasi dan rollback.

Untuk memahaminya, mari kita coba membuat migrasi pertama.

Silahkan ubah kode di atas menjadi seperti ini:

<?php

use Phinx\Migration\AbstractMigration;

class User extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {
        // buat tabel bernama 'users'
        $users = $this->table('users', array('id' => 'id_user'));

        // buat kolom-kolom untuk users
        $users->addColumn('username', 'string', ['limit' => 64])
            ->addColumn('name', 'string', ['limit' => 64])
            ->addColumn('email', 'string', ['limit' => 64])
            ->addColumn('password','string', ['limit' => 255])
            ->addColumn('created_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP'])
            ->create();

    }
}

Silahkan simpan dan selanjutnya kita akan melakukan migrasi.

Perintah Phinx untuk Migrasi

Setelah kita menulis kode migrasi, selanjutnya kita bisa melakukan migrasi dengan perintah:

phinx migrate -e development

Untuk migrasi ke server development.

Migrasi Tabel User

Migrasi pertama kita berhasil, silahkan cek di database…

Sekarang sudah ada tabel User.

Tabel Users

Pada perintah migrasi di atas, kita menggunakan argumen -e development untuk menentukan ke mana kita akan migrasi.

Kalau kita ingin migrasi ke server production berarti kita harus menggunakan -e production.

Silahkan juga melihat opsi argumen yang lainnya dengan perintah:

$ vendor/bin/phinx migrate --help
Usage:
  migrate [options]

Options:
  -c, --configuration=CONFIGURATION  The configuration file to load
  -p, --parser=PARSER                Parser used to read the config file. Defaults to YAML
  -e, --environment=ENVIRONMENT      The target environment
  -t, --target=TARGET                The version number to migrate to
  -d, --date=DATE                    The date to migrate to
  -h, --help                         Display this help message
  -q, --quiet                        Do not output any message
  -V, --version                      Display this application version
      --ansi                         Force ANSI output
      --no-ansi                      Disable ANSI output
  -n, --no-interaction               Do not ask any interactive question
  -v|vv|vvv, --verbose               Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  The migrate command runs all available migrations, optionally up to a specific version
  
  phinx migrate -e development
  phinx migrate -e development -t 20110103081132
  phinx migrate -e development -d 20110103
  phinx migrate -e development -v

Untuk membatalkan migrasi yang baru saja kita lakukan, kita bisa gunakan perintah:

vendor/bin/phinx rollback -e development

Update Perubahan Migrasi

Ada kalanya setelah melakukan migrasi, kita ingin merubah beberapa skema database.

Misalkan, kita ingin menambahkan kolom address pada tabel users

Maka kita bisa membuat lagi kode migrasinya.

vendor/bin/phinx create AddUserAddress

Lalu mengisi kode migrasinya:

<?php

use Phinx\Migration\AbstractMigration;

class AddUserAddress extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {
        // pilih tabel 'users'    
        $users = $this->table('users');
        // tambahkan kolom 'address'
        $users->addColumn('address', 'string', ['limit' => 64]);
        $users->update();

    }
}

Setelah itu, eksekusi lagi perintah migrasinya:

vendor/bin/phinx migrate -e development

Maka tabel users akan diupdate…

Membuat Bibit Data (Seeds)

Seeds adalah data awal yang akan kita masukkan ke database.

Cara membuat seeds bisa dilakukan dengan perintah ini:

vendor/bin/phinx seed:create <NamaSeed>

Contoh:

vendor/bin/phinx seed:create Users

Maka akan tercipata file baru di dalam direktori db/seeds.

<?php

use Phinx\Seed\AbstractSeed;

class Users extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeders is available here:
     * http://docs.phinx.org/en/latest/seeding.html
     */
    public function run()
    {

    }
}

Di dalam kode tersebut terdapat method run(). Method tersebut akan dieksekusi saat kita mengirim seeds ke database.

Maka kita harus menuliskan seeds datanya di sana.

Contoh, kita buat tiga bibit data:

<?php

use Phinx\Seed\AbstractSeed;

class Users extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeders is available here:
     * http://docs.phinx.org/en/latest/seeding.html
     */
    public function run()
    {
        $data = array(
            array(
                'username' => 'ardianta',
                'name' => 'Ardianta',
                'email' => '[email protected]',
                'address' => 'Lombok',
                'password' => password_hash('kopi', PASSWORD_DEFAULT)
            ),
            array(
                'username' => 'admin',
                'name' => 'Admin',
                'email' => '[email protected]',
                'address' => 'Mataram',
                'password' => password_hash("admin", PASSWORD_DEFAULT)
            ),
            array(
                'username' => 'petanikode',
                'name' => 'Petani Kode',
                'email' => '[email protected]',
                'address' => 'Internet',
                'password' => password_hash("admin", PASSWORD_DEFAULT)
            )
            
        );

        $user = $this->table('users');
        $user->insert($data)->save();
    }
}

Setelah itu silahkan eksekusi perintah berikut untuk mengirim bibit datanya ke database:

vendor/bin/phinx seed:run

Apabila berhasil, akan ada data di dalam tabel users.

Seeding data to database

Apa Selanjutnya?

Kita sudah belajar dasar-dasr migrasi database menggunakan Phinx.

Selanjutnya untuk migrasi yang lebih rumit, bisa kamu pelajari di dokumentasi Phinx.

📖 Referensi: