Akelosのmigration

PHP の RailsコピーのAkelosを触ってる。まだVersin0.8だけど、良さそうなので使ってみたい。CakePHPはRailsコピーかと思ったら全然違ったので使うのやめた。

migration

$ php script/generate model Book

上記のコマンドで、Bookモデルが作られる。そうすると、migrateファイルにあたるものが app/installers/book_installesr.php に出来る。デフォルトだと以下のような形になって、バージョンUPとDOWNに対応した処理を書くようになっている。

< ?php
class DrinkInstaller extends AkInstaller
{
    function up_1()
    {
        $this->createTable('drinks', "
          id,
          name
        ");
    }
 
    function down_1()
    {
        $this->dropTable('drinks');
    }
}
?>

createTableの第一引数がテーブル名、第二引数がテーブルの中身になる。第二引数は、カンマでカラム名を区切っていく。型を指定しないと、自動的に最適な型にしてくれるということだが、怪しいので指定したほうが良さそう。以下のように書く。

        $this->createTable('drinks', "
          id,
          name varchar(255),
          descrption text,
          isbn varchar(20) not null
        ");

これをDBに反映させるには script/migrate book install と書く。install をやると up が順に実行され、 uninstall を実行すると down が実行される。

chu@chu-mac:~/Sites/sample$ php script/migrate book install
Upgrading-----
(mysqlt): SET AUTOCOMMIT=0
-----
-----
(mysqlt): BEGIN
-----
-----
(mysqlt): SHOW COLUMNS FROM books
-----
1146: Table 'sample_dev.books' doesn't exist
ADOConnection._Execute(SHOW COLUMNS FROM books, false)% line  854, file: /Users/chu/Sites/akelos/vendor/adodb/adodb.inc.php
ADOConnection.Execute(SHOW COLUMNS FROM books)% line  393, file: /Users/chu/Sites/akelos/vendor/adodb/drivers/adodb-mysql.inc.php
ADODB_mysql.MetaColumns(books, true, false)% line  202, file: /Users/chu/Sites/akelos/vendor/adodb/adodb-datadict.inc.php
ADODB_DataDict.MetaColumns(books)% line  723, file: /Users/chu/Sites/akelos/vendor/adodb/adodb-datadict.inc.php
ADODB_DataDict.ChangeTableSQL(books, id I NOTNULL AUTO KEY,
name varchar(255),
desctipntion XL,
isbn varchar(20) NOTNULL,
updated_at T,
created_at T, Array[1])% line  279, file: /Users/chu/Sites/akelos/lib/AkInstaller.php
-----
(mysqlt): CREATE TABLE books (
id                       INTEGER NOT NULL AUTO_INCREMENT,
name                     VARCHAR(255),
desctipntion             LONGTEXT,
isbn                     VARCHAR(20) NOT NULL,
updated_at               DATETIME,
created_at               DATETIME,
                 PRIMARY KEY (id)
)TYPE=InnoDB
-----
-----
(mysqlt): COMMIT
-----
-----
(mysqlt): SET AUTOCOMMIT=1
-----
Smart Commit occurred

途中にエラーっぽいメッセージがあるが、公式のScreenshot見てもこれが正常な動作のようだ。

ちなみに、以下のように書いておくと migration を uninstall した時にbooksテーブルがdropされます。Railsだと、デフォじゃテーブルやバージョン別のmigrationをサポートしてないからこれは結構便利かも。ただ、みんなで別々にやってたらどうなるのか。全部一気にやる方法がまだわからない。同じファイルに全部書いておけば問題はないと思うけど、要調査。

    function down_1()
    {
        $this->dropTable('books');
    }
Akelosのmigration