manba

№20 Dars - Yiida migratsiya bilan ishlash.

№20 Dars - Yiida migratsiya bilan ishlash.

Migratsiya web dasturlash jarayonida ma`lumotlar omboridagi o`zgarishlarni amalga oshirishni yengillatuvchi va tezlashtiruvchi tehnologiya. Misol uchun, ish jarayonida yangi jadval qo`shilishi mumkin, yoki qaysidir jadvalga ustun qo`shish kabi ishlar.

Bu ma`lumotlar omboridagi o`zgarishlar eng muhim va asosiy ish hisoblandi va u migratsiya orqali amalga oshiriladi.

Agar kodingiz va ma`lumotlar omboringiz boshqalarniki bilan muvofiq bo`lmasa dasturingiz ishlamaydi. Bunday holatni oldini olish maqsadida Yii o`zining migratsiya deb ataluvchi tehnologiyasini ishlab chiqqan. Bu bizga ma`lumotlar omboridagi o`zgarishlarni nazorat qilish imkonini beradi.

Quyida web ilovani ishlab chiqishda migratsiyadan foydalanish jarayonini qadamma qadam ko`rib chiqamiz:

1. Ivan yangi migratsiya hosil qildi (misol uchun, yangi jadval hosil qilish).

2. Ivan sistemani o`zgarishlari bilan to`ldiradi (SVN , GIT yoki boshqalar orqali)

3. Andrey sistemadan o`ziga update qiladi va yangi migratsiya oladi.

4. Andrey o`zining lokalniy ma`lumotlar omborida migratsiyani qo`llidi.

Yii da yiic migrate cmd orqali migratsiya ishlatiladi. Yangi migratsiya yaratishni, bekor qilishni yoki qayta qo`llashni ishlatish mumkin.

Izoh: Migrate komandasi bilan ishlash jarayonida yiic ilovasi bor joyda yaratishni tavsiya qilamiz.Ya`ni cd path/to/protected dan keyin amalga oshirish kerak. Migratsiya fayli hosil bo`lishi uchun mumkin va muvofiq bo`lgan joy bu " protected\migrations " yo`lidir. Shuningdek "protected/config/console.php" da ma`lumotlar ombori bilan bog`lanish sozligini tekshirib qo`yishimiz kerak.

Migratsiya hosil qilish.

Biz yangi migratsiya hosil qilishimiz uchun konsol oynasiga quyidagicha kod kiritishimiz kerak:

yiic migrate create <name>

"name" yozilishi kerak bo`lgan parametr. Bu namega qisqa tarzda tarifi bilan yozilishi maqsadga muvofiq.(Misol uchun, create_news_table). Keyinchalik bu migratsiya classining nomi aslida bir qismi bo`lib qolishini ko`rasizlar. Keyinchalik bunday nom yaratilsaham asl nomi ustma ust tushib qolmaydi.

yiic migrate create create_news_table

m101129_185401_create_news_table.php fayl "protected/migrations" direktoriyasida hosil qilindi va quyidagicha kod avtomat ravishda yoziladi.

class m101129_185401_create_news_table extends CDbMigration
{
    public function up()
    {
    }
 
 
    public function down()
    {
        echo "m101129_185401_create_news_table does not support migration down.\n";
        return false;
    }
 
    /*
    public function safeUp()
    {
    }
 
    public function safeDown()
    {
    }
    */
}

Aytib o`tish joiz migratsiya fayli yaratilayotganda uning nomi quyidagicha strukturaga ega bo`ladi.

m<timestamp>_<name>, <timestamp> bu — migratsiya yaratilayotgan vaqtdagi UTC vaqt formati ( yymmdd_hhmmss ), name esa biz kiritgan nom.

up() metodi migratsiyada amalga oshiriladigan asosiy kodni saqlidi va down() metodi esa up() da amalga oshirilishi kerak bo`lgan kodni bekor qilish kodini saqlidi.

Bazan down() ni amalga oshirishga xojat qolmaydi. Misol uchun up() metodida biz jadvalni o`chirib yuborish kodini yozgan bo`lsak. Unda down() metodida xech qanday kod yozish shart bo`lmay qoladi. Bu holatdagi migratsiyalarda malumotlar omboridagi holatdan joriy holatga qaytarib bo`lmasligini bildiradi. Bu keltirilgan down() metodi kodidan false qiymat qaytadi. Bu migartsiyani down() metodi uchun ishga tushirib bo`lmasligini anglatadi.

Axborot: up() yoki down() metodi 1.1.7 versiyasidan boshlab false qaytaradi. Bundan oldingi versiyalar uchun bu holat amalga oshmaydi. 1.1.6 versiyasi bundan istisno.

Migratsiya misolida news jadvalini yaratishni ko`ramiz.

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');
    }
}

CDbMigration classi bu malumotlar ombori strukturasini va mal`umotlar bilan ishlash uchun metodlar to`plamini taqdim etadi. Misol uchun CDbMigration::createTable metodida yangi jadval hosil qilish mumkin, CDbMigration::insert metodida yangi satr qo`shishimiz mumkin. Xamma metodlar ma`lumotlar ombori bilan bog`langanda bajariladigan metodlardir.

Tranzaksiyali migratsiya

Axborot: Bunday imkoniyat 1.1.7 versiyasidan boshlanadi.

Biz murakkab migratisyalarni amalga oshirayotganimizda, ya`ni hamma berilgan zaproslarni to`liq bajarilishi talab qilinsa va qaysi biridur bajarilmasa qolgan barcha amalga oshgan zaproslarimiz orqaga qaytishini xoxlasak unda tranzaksiyadan foydalanish bizga bu borada ancha imkoniyat beradi.

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;
        }
    }
 
    // …down() uchun o`xshash kod
}

Yana up() o`rniga safeUp() metodini, down() o`rniga safeDown() metodini qo`llashimiz mumkin.

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');
    }
}

Yii ning migratsiyasini amalga oshirilayotganda tranzaksiya bilan boshlanishi kerak, keyin safeUp() va safeDown() kodlari bajariladi. Agarda qandaydir xatolik bo`lsa tranzaksiya barcha qilingan ishlarni oldingi holatga qaytarib qo`yadi. Ya`ni ma`lumotlar ombori migratsiya qilinishidan oldingi holatiga qaytib qoladi.

Izoh: Xamma Malumotlar omborini boshqarish tizimlari ham xamma holatlari uchun ham bajarilmaydi. Bu holatda tranzaksiyani bajarish bo`lmasa, unda up() va down() lardan foydalanish kerak bo`ladi. Bu holatda MySQL yoki MariaDB

MySQL yoki MariaDB bir qancha SQL zaproslarni bajarishda oshkormas tranzaksiyani chaqirib foydalanishimiz mumkin. MySQL va MariaDB dokumentlarini ko`ring.

Migratsiyadan foydalanish.

Barcha migratsiyalarni qo`llash uchun ( sizning lokalniy kompyuteringizda Malumotlar ombori tayyor holatda bo`lishi kerak, ya`ni to`liq o`rnatilgan va hozirda ishlayotgan holatda), quyidagi komandani yozishingiz kerak bo`ladi.

yiic migrate

Bu komanda sizga barcha yangi migratsiyalar ro`yhatini up() metodini ishga tushirish navbati bo`yicha va xar bir migratsiya classlarini hosil qilingan navbati bo`yicha tartibda ko`rsatadi.

Bu ro`yhat bizaga qaysi migratsiyalar bajarilgan va qaysilari yangiligini ko`rsatadi.

Agar tbl_migration jadvali mavjud bo`lmasa, uni ko`rsatilgan db dasturi komponentasi ma`lumotlar omborida avtomat hosil qiladi.

Ba`zan faqat bitta yoki bir qancha yangi migratsiyalarni qabul qilish talab qilinadi. Bu ish uchun quyidagi komandadan foydalaniladi:

yiic migrate up 3


Ro`yhatda boshidagi uchta migratsiyalarni qo`llash. Bunda faqatgina boshidagi uchta yangi migratsiya amalga oshadi. Uchtani o`rniga xoxlagan sonimizni ko`rsatish mumkin.

Migratsiyani bekor qilish.

Bir yoki bir nechta oxirgi qo`llanilgan migratsiayalarni bekor qilish uchun quyidagi komandadan foydalanish mumkin:

yiic migrate down [step]

agar step parametrini bermasangiz oxirgi migratsiyani bekor qiladi.

Avval ham aytganimizdek hamma migratsiyalarni ham bekor qilib bo`lmaydi. Migratsiyani rad qilishimizda bunday migratsiyalar uchun rad qilish jarayoni to`xtatiladi.

Manba:


JONNY - Texnoman foydalanuvchisi

Muallif haqida

JONNY Arduino, Java, C#, Android, Windows, Linux, Debian, Javascript. O'zbekistonni rivojlantiramiz! Dasturlash orqali vatanimizni yangi marralarga olib chiqamiz.


Qiziq bo‘ladi:


Birinchi bo‘ling!

Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!