احسان رضایی

یک توسعه دهنده

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

در yii2 , / تاریخ ارسال 16-08-1395 / 0 نظر / آخرین ویرایش 01-01-1403

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

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

 

پیشنهاد

کتاب‌ها

کتاب الگوهای طراحی به بیان ساده(design patterns / دیزاین پترن)

در مهندسی نرم افزار، design patterns(الگوهای طراحی) راه حل‌های قابل استفاده برای مشکلاتی هستند که معمولاً در طراحی نرم‌افزار اتفاق می افتند.

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

کتاب refactoring / ریفکتورینگ

Refactoring مجموعه‌ای از تکنیک‌هاست که به منظور اصلاح و بهبود کدهای قبلی بدون تغییر در عملکرد و رفتارشان جهت خوانایی، کارامدی و قابلیت نگهداری بیشتر انجام می‌شود.

در کتاب Refactoring اثر Martin Fowler نوشته شده: refactoring تکنیک مرتب/منظم سازی برای تجدید ساختار کد موجود است. تغییر ساختار داخلی کد بدون تغییر رفتار خارجی آن.

refactoring یک سرمایه‌گذاری و راه حلی برای مقابله با کد کثیف و بدهی فنی است که باعث کاهش هزینه‌های توسعه نرم‌افزار در آینده خواهد شد.

ارسال نظر