در زمان توسعه یک نرم افزار پایگاه داده محور، ساختار پایگاه داده درست مثل سورس نرم افزار توسعه پیدا میکند...
به عنوان مثال، در هنگام توسعه نرم افزار ممکن است به یک جدول جدید نیاز پیدا کنید یا پس از اتمام پروژه و ارائه نسخه ی پایدار آن شاید به این نتیجه برسید که اضافه کردن شاخص(index) به ساختار یک جدول باعث بهبود کارایی نرم افزارتان میشود و...
از آنجایی که معمولا با اینگونه تغییرات باید کمی سورس نرم افزار را هم تغییر دهید yii از database migration پشتیبانی میکند.
migration در yii این امکان را به شما میدهد تا بتوانید یک migrate جدید ایجاد، اعمال، بازگردانی یا اعمال مجدد کنید. نتیجه ی تمام migrate های ایجاد شده تاریخچه ای از توسعه ی دیتابیس شماست که میتوانید ساختار و گاهی محتوای اندکی از دیتابیس را همیشه در کنار نرم افزار خود داشته و به آسانی آن را مدیریت کنید.
تمام این امکانات از طریق خط فرمان(command line) قابل استفاده هستند، میتوانید برای مشاهده توضیحات migration در خط فرمان از دستور
yii help migrate
استفاده کنید.
1) ایجاد migrations
برای ایجاد یک migration جدید از دستور
yii migrate/create <name>
استفاده میکنیم، <name> الزامی است و به معنای شرح مختصری از migrate ماست به عنوان مثال اگر یک migration برای ساخت جدول اخبار create میکنید بهتر است create_news_table را به عنوان نام migrate خود انتخاب کنید.
yii migrate/create create_news_table
نکته، آرگومان <name> در بخشی از نام کلاس migrate قرار داده میشود پس فقط میتوانید از حروف، اعداد(لاتین) و underscore برای آن استفاده کنید.
دستور فوق کلاسی به نام m150101_185401_create_news_table در مسیر @app/migrations(اگر از قالب advanced استفاده میکنید در مسیر console\migrations به دنبال کلاس های migration بگردید) با ساختار زیر تولید میکند
use yii\db\Migration;
class m150101_185401_create_news_table extends Migration
{
public function up()
{
}
public function down()
{
echo "m101129_185401_create_news_table cannot be reverted.";
return false;
}
}
نام این کلاس به طور خودکار با فرمت mYYMMDD_HHMMSS_Name تولید میشود. YYMMDD_HHMMSS در واقع UTC datetime ایجاد migration و Name نامی است که شما برای migrate خود در نظر گرفته اید.
به منظور توسعه و تغییر جداول پایگاه داده باید در متد up کدهای مورد نظر خود را بنویسید، معمولا زمانی از متد down استفاده میکنیم که تصمیم بر بازگردانی کدهای نوشته شده متد up را داریم.
up زمانی فراخوانی میشود که پایگاه داده را upgrade میکنیم در حالی که هنگام downgrade، متد down فراخوانی خواهد شد.
کد زیر نشان میدهد که چگونه یک کلاس migration برای ایجاد جدول news پیاده سازی کنیم
<?php
use yii\db\Migration;
class m150101_185401_create_news_table extends Migration
{
public function up()
{
$this->createTable('news', [
'id' => $this->primaryKey(),
'title' => $this->string()->notNull(),
'content' => $this->text(),
]
);
}
public function down()
{
$this->dropTable('news');
}
}
2) اعمال migrations
پس از اینکه تغییرات کلاس migration تمام شد برای upgrade پایگاه داده به آخرین ساختار، میتوانید با دستور زیر تمام migration های جدید را اعمال کنید
yii migrate
این دستور لیستی از تمام migration های جدید اعمال نشده را نمایش و پس از تایید شما آنها را اعمال میکند. migration ها یکی پس از دیگری به ترتیب زمان ایجاد خود اعمال میشوند، اگر در هنگام این عملیات یکی از migration ها موفق به اعمال نشود(مثلا وجود یک خطای املایی در کلاس) اجرای migration های دیگر ناتمام میماند و از ادامه عملیات صرف نظر خواهد شد.
گاهی اوقات ممکن است شما بخواهید فقط یک یا چند migration اعمال شوند، میتوانید با مشخص کردن تعداد migration ها این کار را انجام بدهید. به عنوان مثال دستور زیر فقط 3 migration اول را اعمال میکند.
yii migrate 3
همینطور میتوانید به صراحت یک migration خاص را با استفاده از روش های زیر مشخص و اعمال کنید. توجه داشته باشید که با استفاده از این دستور و حالت های مختلف آن شما مشخص میکنید یک migration خاص به همراه migration های قبل از خودش اعمال شود.
yii migrate/to 150101_185401 # using timestamp to specify the migration
yii migrate/to "2015-01-01 18:54:01" # using a string that can be parsed by strtotime()
yii migrate/to m150101_185401_create_news_table # using full name
yii migrate/to 1392853618 # using UNIX timestamp
و در نهایت شاید بخواهید فقط یک migration مشخص اعمال گردد
yii migrate/mark 150101_185401 # using timestamp to specify the migration
yii migrate/mark "2015-01-01 18:54:01" # using a string that can be parsed by strtotime()
yii migrate/mark m150101_185401_create_news_table # using full name
yii migrate/mark 1392853618 # using UNIX timestamp
3) بازگردانی migrations
جهت بازگردانی یک یا چند migration میتوانید از دستور زیر استفاده کنید
yii migrate/down # revert the most recently applied migration
yii migrate/down 3 # revert the most 3 recently applied migrations
4) اعمال مجدد migrations
اعمال مجدد به معنی بازگردانی migration ها و سپس استفاده دوباره(اعمال مجدد) آنهاست.
yii migrate/redo # redo the last applied migration
yii migrate/redo 3 # redo the last 3 applied migrations
5) لیست migrations
لیست migration هایی اعمال شده یا نشده را میتوانید با استفاده از دستورات زیر مشاهده کنید
yii migrate/history # showing the last 10 applied migrations
yii migrate/history 5 # showing the last 5 applied migrations
yii migrate/history all # showing all applied migrations
yii migrate/new # showing the first 10 new migrations
yii migrate/new 5 # showing the first 5 new migrations
yii migrate/new all # showing all new migrations
migrations migration database