Email: me.dev@developit.ir

درس های yii2 شماره 7: database migration

 در زمان توسعه یک نرم افزار پایگاه داده محور، ساختار پایگاه داده درست مثل سورس نرم افزار توسعه پیدا میکند...

به عنوان مثال، در هنگام توسعه نرم افزار ممکن است به یک جدول جدید نیاز پیدا کنید یا پس از اتمام پروژه و ارائه نسخه ی پایدار آن شاید به این نتیجه برسید که اضافه کردن شاخص(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 بگردید) با ساختار زیر تولید میکند

<?phpuse 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 پیاده سازی کنیم

<?phpuse 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 اعمال شوند، میتوانید با مشخص کردن تعداد migration ها این کار را انجام بدهید. به عنوان مثال دستور زیر فقط 3 migration اول را اعمال میکند.

yii migrate 3

همینطور میتوانید به صراحت یک migration خاص را با استفاده از روش های زیر مشخص و اعمال کنید. توجه داشته باشید که با استفاده از این دستور و حالت های مختلف آن شما مشخص میکنید یک migration خاص به همراه migration های قبل از خودش اعمال شود.

yii migrate/to 150101_185401                      # using timestamp to specify the migrationyii 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 nameyii migrate/to 1392853618                         # using UNIX timestamp

و در نهایت شاید بخواهید فقط یک migration مشخص اعمال گردد

yii migrate/mark 150101_185401                      # using timestamp to specify the migrationyii 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 nameyii migrate/mark 1392853618                         # using UNIX timestamp

 

3) بازگردانی migrations 

جهت بازگردانی یک یا چند migration میتوانید از دستور زیر استفاده کنید

yii migrate/down     # revert the most recently applied migrationyii migrate/down 3   # revert the most 3 recently applied migrations

4) اعمال مجدد migrations

اعمال مجدد به معنی بازگردانی migration ها و سپس استفاده دوباره(اعمال مجدد) آنهاست.

yii migrate/redo        # redo the last applied migrationyii migrate/redo 3      # redo the last 3 applied migrations

5) لیست migrations

لیست migration هایی اعمال شده یا نشده را میتوانید با استفاده از دستورات زیر مشاهده کنید

yii migrate/history     # showing the last 10 applied migrationsyii migrate/history 5   # showing the last 5 applied migrationsyii migrate/history all # showing all applied migrationsyii migrate/new         # showing the first 10 new migrationsyii migrate/new 5       # showing the first 5 new migrationsyii migrate/new all     # showing all new migrations

 

این مطلب آخرین بار در تاریخ 1396/06/07 - 17:23 ویرایش شده است.

ارسال نظر
عضویت در خبرنامه
جهت اطلاع از آخرین فعالیت های من لطفا در خبرنامه عضو شوید