Panduan Migrasi Database Menggunakan 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:
- Ekspor database;
- Upload proyek ke server production (hosting);
- 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:
production
untuk server hosting.development
untuk server lokal (localhost).testing
untuk server testing.
Untuk saat ini kita gunakan yang development
saja.
Silahkan buat database baru.
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.
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.
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 pertama kita berhasil, silahkan cek di database…
Sekarang sudah ada tabel User
.
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
.
Apa Selanjutnya?
Kita sudah belajar dasar-dasr migrasi database menggunakan Phinx.
Selanjutnya untuk migrasi yang lebih rumit, bisa kamu pelajari di dokumentasi Phinx.