Showing posts with label migrations. Show all posts
Showing posts with label migrations. Show all posts

Monday, November 22, 2010

Adatbázis migrációk a Yii-vel

A Rails keretrendszernek köszönhetően az elmúlt pár évben nagy teret hódított az Adatbázis Migrációk (Migrations) használata, még PHP-s környezetben is. Személyesen hallottam olyanról, hogy míg az egész rendszer PHP alatt futott, a programozók a Rails-t használták táblák és kapcsolatok készítésére.

Persze több kevesebb sikerrel megjelentek PHP-vel hajtott alkalmazások is, az egyik ilyen pl. a Doctrine Project. Ebben a cikkben azonban a Pieter Claerhout által publikált, és a Yii alá készített Yii-DbMigrations-t fogjuk ismertetni.

Mire jó ez egyáltalán?

Felmerülhet a kérdés, hogy miért is van szükség ilyen rendszerek használatára. A felvetés jogos, hiszen sima SQL-t használva is készíthetünk táblákat és kapcsolatokat. Valóban, viszont az így készített ún. tábla leírások (schema) kifejezetten az adott adatbásban működnek.

Képzeljük el például, hogy a fejlesztés kezdetén SQLite-ot használtunk és késöbb szeretnénk az adatbézisunkat MySQL alá tenni (mondjuk a LIVE szerveren). Sajnos ilyen esetben az összes tábla leírást újra kell készítenünk, mivel a két adatbázis motorban használt SQL nem kompatibilis. Itt jön a képbe az Adatbázis Migráció.

A lényeg az, hogy adtabázisleíró nyelvtől függetlenül tudunk táblákat és kapcsolatokat készíteni a PHP segítségével. Az így elkészített tábla osztályokat pedig nagyon egyszerűen a kívánt (és támogatott!) adatbázis alá be lehet illeszteni. Külön hab a tortán, hogy arra sem kell emlékeznünk, hogy melyik volt az utolsó lefuttatott tábla osztály, mindezt a Yii-DbMigartions elvégzi helyettünk. Úgy is gondolhatunk rá, mint egy adatbázisra szabott Forráskezelő program (pl: SVN vagy GIT)

Hátrányok

A modul még csak alpha állapotban van.
Jelenleg csak SQLite és MySQL támogatott.
    Installálás és Beállítás

    Miután kicsomagoltuk a zip file-t a szokásos helyre - protected/extensions, győződjünk meg arról, hogy az adatbázissal kapcsolatos beállítások megfelelőek a protected/config/main.php-ben.

    MySQL:


    SQLite:


    A Parancssor beállítása

    Alap esetben természetesen a yiic nem tud a migrate utasításról, hiszen még csak most telepítettük a modult. Ezért be kell állítanunk egy új commandMap-et  a protected/config/console.php file-ban:




    Beállítások tesztelése

    Ha minden jól sikerült, egyszerűen futtassuk le a yiic parancsot a parancssorból:


    Reméljük így a migrate parancs már elérhető.

    Migrációk készítése

    Nevvekkel kapcsolatos korlátozások

    A migrációs file-okat a protected/migrations vagy a migrations mappába (a modul könyvtárába) helyezhetjük el. Az file-ok neveit pedig a következő képpen ajánlatos elnevezni:

    m20090614213453_MigracioNeve.php

    A névnek mindig egy 'm' betűvel kell kezdődnie, utána egy 14 karakter hosszú dátumot meghatározó string, egy aláhúzásjel '_' és végül pedig egy szabadon választható MigrációNév.

    Persze, szerencsénkre, ezt automatikusan is megtehetjük a protected/yiic migrate create <MigracioNev> lefuttatásával:



    Táblaleírások készítése

    Magában a tábla leíró file-ban létre kell hoznunk egy osztályt, aminek a szülő osztálya a CDbMigration, és két kötelező metódusunk az up és down lesz. Reméljük a következő példa kicsit segíteni fog:



    Tehát az up() segítségével elkészítjük az új táblát, a down()-nal pedig töröljük.

    Támogatott funkciók

    A migráció osztályban a következő funkciók érhetők el:


    • execute: sima SQL futtatása, ami nem ad vissza értéket.
    • query: sima SQL futtatása, ami értékkel tér vissza.
    • createTable: új tábla készítése
    • newTable: új tábla leírás készítése
    • addTable: táblaleírás hozzáadása a migrációhoz
    • renameTable: tábla átnevezése
    • removeTable: tábla törlése
    • addColumn: oszlop hozzáadása a táblához
    • renameColumn: oszlop átnevezése
    • changeColumn: oszlop változtatása
    • removeColumn: oszlop törlése
    • addIndex: index hozzáadása táblához vagy adatbázishoz
    • removeIndex: index törlése táblából vagy adatbázisból.

    Mezőleíró beállításoknál pedig a következő változók használhatók:


    • primary_key
    • string
    • text
    • integer
    • float
    • decimal
    • datetime
    • timestamp
    • time
    • date
    • binary
    • boolean
    • bool

    Persze ezen kívül lehet adatbázis specifikus mezőket is készíteni, viszont úgy nem tudjuk a programot más adatbázis alá (könnyedén) átemelni.

    Táblák készítése másként



    Migrációk futtatása

    Csak azért mert elkészítettük a tábla-leírásokat, az nem azt jelenti, hogy a táblák már készen is vannak az adatbázisban. A migrate parancs lefuttatásával történik meg mindez:



    Még itt a végén annyit érdemes megjegyezni, hogy ha most lefuttatnánk a migrate parancsot mégegyszer, semmi nem történne, hiszen a modul megjegyzi, hogy melyik volt az utolsóként lefutott migráció.

    És ennyi! Mindenképpen javaslom az eredeti cikk elolvasását is, mert ott még van egy-két utasítás amire nem tértünk itt ki, de remélem ezek után mindenkinek megjön a kedve egy kis adatbányászáshoz :)