Phalcon

Phalconのデータベースマイグレーション

更新日:

今日は、Phalconの公式サイトを見ながら、Phalconのマイグレーションについて調べてみます。

マイグレーションは、構造化され、組織的にデータベースを変更する便利な方法です。

開発においてしばしば、私たちは本番環境の変化を更新する必要があります。これらの変更のいくつかは、新しい分野、新しいテーブル、削除インデックス、などのデータベースの変更の可能性がありました。

マイグレーションは、データベースがその時点でどのように構造化されるかを説明するために作成されるクラスのセットです。これらのクラスは、あなたのアプリケーションが、実装する新しい変更で動作する準備ができているように、リモート·データベース上にスキーマ構造を同期するために使用することができます。マイグレーションはプレーンなPHPを使用してこれらの変換について記述します。

スキーマのダンプ

Phalcon Developer Toolsは、マイグレーション(世代、ランニングやロールバック)を管理するためのスクリプトを提供します。

マイグレーションを発生させるための利用可能なオプションは次のとおりです。

2015-04-09 15-50-27

公式サイトでは、phalcon gen-migration --helpでオプションが表示されるとのことでしたが、それだとエラーになります(下記参照)し、phalcon migration --helpでも、エラーになります。単に、phalcon migrationと入力すると、Options: の下に、オプションが表示されます。
2015-04-09 16-01-19

各マイグレーションは、それに関連するバージョン識別子を持っています。バージョン番号は、マイグレーションがデータベースの、現在の「バージョン」よりも新しいか古いかを、識別することができます。マイグレーションを実行するときに。実行されているバージョンもPhalconに知らせます。

マイグレーションが発生すると、命令が移動およびこれらのステートメントの実行時間の異なるステップを説明するために、コンソールに表示される。最後に、マイグレーションのバージョンが生成される。

デフォルトでは、Phalcon Developer Toolsは、app/migrationsディレクトリを使用します。あなたは、生成スクリプトのパラメータの1つを設定することで、場所を変更することができます。データベースの各テーブルには、そのバージョンを参照するディレクトリの下に区切られたファイルで生成された、それぞれのクラスがあります。

Phalcon Developer Toolsのコマンドが変更になっているみたいですので、下記にコマンド一覧を表示(phalcon commands)します。※尚、phalconと入力するだけでもコマンド一覧を表示します。
2015-04-09 16-25-36

  • commands(alias of: list,enumerate)
    上記で説明したように、commandsをつけなくても、コマンド一覧を表示しますので、別に覚える必要はないと思います。
  • controller (alias of: create-controller)
    phalcon controller でオプションが表示されます。
    phalcon controller [name] [directory]で、コントローラーを作成します。directoryを省略すれば、app/controllerフォルダ内に、新規コントローラーを作成します。オプションの正確な使い方は、勉強したら、そのうちご紹介します。
    2015-04-09 16-43-30
  • model (alias of:create-model)
    上記と同様に、phalcon model で、モデルのオプションが表示されます。
    phalcon model [table-name][optons] で、モデルを作成します。下記に、オプションを表示しておきます。このオプションについてもそのうち調べてみたいと思います。
    2015-04-09 16-49-57
  • all-models (alias of : create-all-models)
    phalcon all-models で、データベース上のすべてのテーブルのモデルを生成します。下記のように、既に作成されているモデルは、スキップされます。
    2015-04-09 16-54-01
  • project ( alias of : create-project)
    phalcon project [name][type][directory][enable-webtools] で、プロジェクトを生成します。
    phalcon project で、下記の様にプロジェクトのオプションが表示されます。
    2015-04-09 16-59-06
  • scaffold
    phalcon scaffold [tableName][options] で、スキャフォールドが生成されます。
    オプションは、下記の様になっています。
    2015-04-09 17-02-19

マイグレーションクラスの構造

各ファイルには、Phalcon\Mvc\Model\Migrationを拡張するユニークなクラスが含まれています。それらのクラスは、通常、up()メソッドとdowh()メソッドの2つのメソッドを持っています。up()メソッドは、マイグレーションを実行し、down()メソッドがロールバックします。

up()メソッドには、マジックメソッドのmorphTable()メソッドも含まれています。それは与えられた記述にデータベース内の実際のテーブルを同期するために必要な変更を認識すると実行されます。

<?php
use Phalcon\Db\Column as Column;
 use Phalcon\Db\Index as Index;
 use Phalcon\Db\Reference as Reference;
class ProductsMigration_100 extends \Phalcon\Mvc\Model\Migration
 {
public function up()
 {
 $this->morphTable(
 "products",
 array(
 "columns" => array(
 new Column(
 "id",
 array(
 "type" => Column::TYPE_INTEGER,
 "size" => 10,
 "unsigned" => true,
 "notNull" => true,
 "autoIncrement" => true,
 "first" => true,
 )
 ),
 new Column(
 "product_types_id",
 array(
 "type" => Column::TYPE_INTEGER,
 "size" => 10,
 "unsigned" => true,
 "notNull" => true,
 "after" => "id",
 )
 ),
 new Column(
 "name",
 array(
 "type" => Column::TYPE_VARCHAR,
 "size" => 70,
 "notNull" => true,
 "after" => "product_types_id",
 )
 ),
 new Column(
 "price",
 array(
 "type" => Column::TYPE_DECIMAL,
 "size" => 16,
 "scale" => 2,
 "notNull" => true,
 "after" => "name",
 )
 ),
 ),
 "indexes" => array(
 new Index(
 "PRIMARY",
 array("id")
 ),
 new Index(
 "product_types_id",
 array("product_types_id")
 )
 ),
 "references" => array(
 new Reference(
 "products_ibfk_1",
 array(
 "referencedSchema" => "invo",
 "referencedTable" => "product_types",
 "columns" => array("product_types_id"),
 "referencedColumns" => array("id"),
 )
 )
 ),
 "options" => array(
 "TABLE_TYPE" => "BASE TABLE",
 "ENGINE" => "InnoDB",
 "TABLE_COLLATION" => "utf8_general_ci",
 )
 )
 );
 }
 }

クラスは、「ProductsMigration_100」と呼ばれている。サフィックス100は、バージョン1.0.0を指します。morphTable()は4つの可能なセクションとの連想配列を受け取ります。

Index 説明 Optional
“columns” テーブルの列のセットを持つ配列 No
“indexes” テーブルインデックスのセットを持つ配列 Yes
“references” テーブル参照(外部キー)のセットを持つ配列 Yes
“options” テーブル作成オプションのセットを持つ配列。このオプションは、多くの場合、マイグレーションが生成されたデータベースシステムに関連している。 Yes

 

カラムの定義

テーブルPhalcon\Db\Columnクラスは、テーブルの列を定義するために使用されます。それは、列に関連するさまざまな機能をカプセル化します。そのコンストラクタは、最初のパラメータとして列名と列を記述した配列を受け取ります。列を記述する際に以下のオプションを使用できます。

Option 説明 Optional
“type” カラムのタイプ。Phalcon_Db_Columnの定数でなければなりません。 (下記参照) No
“size” VARCHARやINTEGERのようなカラムのタイプは、特定のサイズを持つことができます。 Yes
“scale” DECIMAL や NUMBER列は、小数点以下のスケールを持っているかもしれません。 Yes
“unsigned” INTEGER 列は、符号付または、符号無しにすることもできる。このオプションは、他の型のカラムには適用されません。 Yes
“notNull” カラムにNULL値を格納することができますか? Yes
“autoIncrement” この属性を指定した列は、オートインクルメントで、自動的整数が入力されます。テーブル内の唯一つのカラムだけがこの属性を持つことができます。 Yes
“first” カラムは、最初の位置に配置しなければならない。 Yes
“after” カラムは、指定されたカラムの後に配置する必要があります。 Yes

 

データベースのマイグレーションは、下記のデータベースタイプをサポートしています。

  • Phalcon\Db\Column::TYPE_INTEGER
  • Phalcon\Db\Column::TYPE_DATE
  • Phalcon\Db\Column::TYPE_VARCHAR
  • Phalcon\Db\Column::TYPE_DECIMAL
  • Phalcon\Db\Column::TYPE_DATETIME
  • Phalcon\Db\Column::TYPE_CHAR
  • Phalcon\Db\Column::TYPE_TEXT

インデックスの定義

Phalcon\Db\Indexは、テーブルインデックスを定義します。インデックスは、その名前とそのカラムのリストを定義するだけです。任意のインデックスがPRIMARY名を持っている場合、ファルコンは、そのテーブルの主キーインデックスを作成することに注意してください。

テーブル外部参照の定義

Phalcon\Db\Referenceは、テーブル参照(別名外部キー)を定義します。以下のオプションは、参照を定義するために使用することができます。

Index 説明 Optional
“referencedTable” これは、自動記述です。それは、参照されるテーブルの名前を指します。 No
“columns” 参照を持つテーブルでカラムの名前を持つ配列 No
“referencedColumns” 参照されるテーブルでのカラムの名前の配列 No
“referencedTable” 参照されるテーブルは多分、別のスキーマまたは、データベースにあります。このオプションでは、あなたはそれを提起することができます。 Yes

 

マイグレーションの記述

マイグレーションは、「morph」テーブルにのみ、設計されるわけではありません。マイグレーションは、これらの機能に限定していない、普通のPHPクラスです。たとえば、列を追加した後は、既存のレコードに対して、その列の値を設定するコードを書くことができます。詳細および個別の方法の例については、database componetをチェックしてください。

<?php
class ProductsMigration_100 extends \Phalcon\Mvc\Model\Migration
 {
public function up()
 {
 //...
 self::$_connection->insert(
 "products",
 array("Malabar spinach", 14.50),
 array("name", "price")
 );
 }
}

マイグレーションの実行

生成されたマイグレーションでは、ターゲット·サーバーにアップロードされると、次の例に示すように、あなたは簡単にそれらを実行することができます。

マイグレーションに関してデータベースがいかに時代遅れに応じて、ファルコンは、同じ移行プロセスで複数のマイグレーションのバージョンを実行することができます。あなたがターゲットバージョンを指定した場合は、指定されたバージョンに到達するまで、ファルコンは、必要なマイグレーションを実行します。

すみません、最後のマイグレーションの実行に関しての英文の意味がいまいち理解できませんでした。

本日は、ここまでにします。

本日のまとめ

  1. migration generateで、マイグレーションファイルの作成
  2. migration runで、マイグレーションの実行
  3. マイグレーションは、Phalcon\Mvc\Model\Migrationを拡張する
  4. Migrationには、up()メソッドとdown()メソッドがある
  5. up()メソッドが実行、down()メソッドがロールバック
  6. up()メソッドには、マジックメソッドのmorphTable()メソッドも含まれている
  7. クラス名は、テーブル名+Migration+_バージョンナンバーで記述する
  8. morphTable()のセクションは下記の通り
    1. columns
    2. indexes
    3. references
    4. options
  9. カラムのオプションは下記の通り
    1. type
      カラムのタイプ

      • Phalcon\Db\Column::TYPE_INTEGER
      • Phalcon\Db\Column::TYPE_DATE
      • Phalcon\Db\Column::TYPE_VARCHAR
      • Phalcon\Db\Column::TYPE_DECIMAL
      • Phalcon\Db\Column::TYPE_DATETIME
      • Phalcon\Db\Column::TYPE_CHAR
      • Phalcon\Db\Column::TYPE_TEXT
    2. size
    3. scale
    4. unsigned
    5. notNull
    6. autoIncrement
    7. first
    8. after

-Phalcon

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.