Sama seperti halnya dengan source code, struktur database selalu berkembang seiring kita mengembangkan dan merawat aplikasi database-driven. Misalnya, ketika saat pengembangan, kita ingin menambah sebuah tabel baru, atau setelah aplikasi sudah rampung, kita mungkin menyadari perlu menambah sebuah indeks pada sebuah kolom. Sangatlah penting untuk selalu menjaga track dari perubahan strutktural database ini (yang disebut dengan migration (migrasi) seperti halnya yang kita lakukan pada source code. Jika source code dan database tidak tersinkronisasi, besar peluangnya keseluruhan aplikasi akan rusak. Karena itulah, Yii menyediakan fungsi migrasi database yang bisa menjaga histori migrasi database, mengaplikasikan migrasi baru ataupun mengembalikannya. Berikut merupakan langkah-langkah yang dilakukan untuk migrasi database pada masa pengembangan:
Yii mendukung migrasi database melalui perintah Berikut ini, kita akan menjelaskan cara penggunaan tool ini.
1. Pembutan Migrasi ¶Untuk membuat sebuah migrasi baru (seperti membuat table news), kita jalankan perintah ini: yiic migrate create <name> Parameter wajib yiic migrate create create_news_table Perintah di atas akan membuat sebuah file baru bernama class m101129_185401_create_news_table extends CDbMigration
{
public function up()
{
}
public function down()
{
echo "m101129_185401_create_news_table tidak mendukung migration down.\n";
return false;
}
/*
// implementasi safeUp/safeDown jika perlu transaction.
public function safeUp()
{
}
public function safeDown()
{
}
*/
} Perhatikan bahwa nama kelas sama dengan nama file dengan pola Method Kadangkala, mengimplementasi
Contohnya, mari melihat tentang cara pembuatan sebuah tabel news. class m101129_185401_create_news_table extends CDbMigration
{
public function up()
{
$this->createTable('tbl_news', array(
'id' => 'pk',
'title' => 'string NOT NULL',
'content' => 'text',
));
}
public function down()
{
$this->dropTable('tbl_news');
}
} Kelas dasar
CDbMigration menyediakan sekumpulan method untuk manipulasi data dan skema database. Misalnya, CDbMigration::createTable akan membuat table database, sedangkan CDbMigration::insert akan menyisipkan sebuah baris data.
Method-method ini semuanya menggunakan koneksi database yang dikembalikan oleh CDbMigration::getDbConnection(), yang secara default akan mengembalikan
2. Transactional Migrations ¶
Ketika melakukan migrasi DB yang kompleks, kita umumnya ingin memastikan apakah setiap migrasi cukup berhasil atau gagal sebagai kesatuan sehingga perawatan database bisa tetap konsisten dan integritas. Guna mencapai tujuan ini, kita dapat memanfaatkan DB transaction. Kita dapat secara eksplisit memulai sebuah transaksi DB dan menyertakan sisa code yang berhubungan dengan DB, seperti berikut ini: class m101129_185401_create_news_table extends CDbMigration
{
public function up()
{
$transaction=$this->getDbConnection()->beginTransaction();
try
{
$this->createTable('tbl_news', array(
'id' => 'pk',
'title' => 'string NOT NULL',
'content' => 'text',
));
$transaction->commit();
}
catch(Exception $e)
{
echo "Exception: ".$e->getMessage()."\n";
$transaction->rollBack();
return false;
}
}
// ...similar code for down()
} Namun, cara lebih gampang untuk mendapatkan dukungan transaction adalah dengan mengimplementasikan class m101129_185401_create_news_table extends CDbMigration
{
public function safeUp()
{
$this->createTable('tbl_news', array(
'id' => 'pk',
'title' => 'string NOT NULL',
'content' => 'text',
));
}
public function safeDown()
{
$this->dropTable('tbl_news');
}
} Ketika Yii melakukan migrasi, maka Yii akan memulai DB transaction dan memanggil
3. Mengaplikasikan Migrasi ¶Untuk mengaplikasikan migrasi baru yang tersedia (misalnya membuat database lokal up-to-date), jalankan perintah berikut: yiic migrate Perintah ini akan menampilkan daftar semua migrasi yang baru. Jika Anda konfirmasi untuk mengaplikasikan migrasi, maka akan dijalankan method Setelah mengaplikasikan migrasi, tool migrasi akan mencatat record di sebuah table database bernama Kadang-kadang, kita hanya ingin mengaplikasikan satu atau beberapa migrasi. Kita dapat menggunakan perintah berikut ini: yiic migrate up 3 Perintah ini kan mengaplikasikan 3 migrasi baru. Dengan mengubah nilai 3 akan mengubah jumlah migrasi yang diaplikasikan. Kita juga dapat migrasikan database ke versi tertentu melalui perintah berikut: yiic migrate to 101129_185401 Kita menggunakan bagian timestamp pada nama migrasi untuk menentukan versi yang ingin kita migrasikan databasenya. Jika terdapat beberapa migrasi di antara migrasi terakhir yang di-apply dan migrasi khusus, semua migrasi ini akan diaplikasikan. Jika migrasi yang ditetapkan telah diaplikasikan sebelumnya, maka seluruh migrasi diaplikasikan setelah di-revert (kembalikan ke semula) 4. Me-Revert Migrations ¶Untuk me-revert migrasi yang paling terakhir atau beberapa migrasi yang sudah teraplikasikan, kita dapat menggunakan command berikut ini: yiic migrate down [step] dengan parameter opsional Seperti yang sudah disebutkan sebelumnya, tidak semua migrasi dapat di-revert. Mencoba me-revert migrasi seperti demikian akan menghasilkan error dan menghentikan seluruh proses revert. 5. Mengulangi Migrasi ¶Mengulangi migrasi maksudnya melakukan revert kemudian mengaplikasikan migrasi tertentu. Proses ini dapat dilakukan dengan melakukan perintah berikut: yiic migrate redo [step] dengan parameter opsional 6. Menampilkan Informasi Migrasi ¶Selain mengaplikasikan dan me-revert migrasi, perangkat migrasi juga dapat digunakan untuk menampilkan histori migrasi dan migrasi baru yang akan diaplikasikan. yiic migrate history [limit] yiic migrate new [limit] Parameter opsional Perintah pertama yang menampilkan migrasi yang sudah diaplikasikan, sedangkan perintah kedua menampilkan migrasi yang belum diaplikasikan. 7. Mengubah Histori Migrasi ¶Kadang-kadang, mungkin kita ingin mengubah histori migrasi ke versi migrasi tertentu tanpa sebetulnya mengaplikasikan atau me-revert kembali migrasi yang bersangkutan. Biasanya sering terjadi selama pengembangan migrasi baru. Kita dapat menggunakan perintah berikut. yiic migrate mark 101129_185401 Perintah ini sangat mirip dengan perintah 8. Mengkustomisasi Perintah Migrasi ¶Terdapat beberapa cara untuk mengkustomisasi perintah migration. Menggunakan Opsi Command LinePerintah migrasi datang dari empat opsi yang dpaat ditentukan di command line:
Untuk menentukan opsi-opsi tersebut, jalankan perintah migrate dengan format ini yiic migrate up --option1=value1 --option2=value2 ... Misalnya kita ingin migrasi module forum yang file-file migrasinya terletak di direktori module yiic migrate up --migrationPath=ext.forum.migrations Mengatur Perintah Secara GlobalOpsi command line memungkinkan kita melakukan konfiguras secara on-the-fly, namun kadangkala kita mungkin ingin mengatur command untuk selamanya. Misalnya, kita ingin menggunakan tabel yang berbeda untuk menyimpan histori migrasi, atau kita ingin menggunakan sebuah template migrasi yang sudah kita desain. Kita dapat melakukannya dengan mengubah konfigurasi console aplikasi dengan begini, return array(
......
'commandMap'=>array(
'migrate'=>array(
'class'=>'system.cli.commands.MigrateCommand',
'migrationPath'=>'application.migrations',
'migrationTable'=>'tbl_migration',
'connectionID'=>'db',
'templateFile'=>'application.migrations.template',
),
......
),
......
); Sekarang jika kita jalankan perintah |