Manager モジュール

Manager モジュール -- データベースの構造を管理するためのモジュール

説明

Manager モジュールは、データベースの構造を管理するためのメソッドを提供します。 これらのメソッドは、その機能によって分類され、データベース要素の 作成、編集 (alter あるいは update)、一覧および削除 (drop) といった機能があります。このドキュメントでは、 使用できるメソッドについて説明してその使用例を示します。 データベース "events_db" において、次のようなテーブルを 作成、変更そして削除するものとします。
events(id, name, datetime);
people(id, name);
event_participants(event_id, person_id);
Manager モジュールの機能を組み込むには、まず最初にそれを読み込む必要があります。
モジュールを組み込むと、このようにそのメソッドを使用することができます。
このドキュメントでは、これ以降は PHP 5 互換の方法を使用します。

データベース要素の作成

これらのメソッドは、新しいデータベースやテーブル、インデックス、 制約そしてシーケンスを作成するものです。

データベースの作成

テーブルの作成

データベースが作成できたので、こんどはそこにテーブルを追加していきましょう。 メソッド createTable() には三つのパラメータを指定します。 それぞれテーブル名、フィールド定義の配列および追加のオプション (任意。RDBMS 固有のもの) となります。
定義配列のキーは、テーブルのフィールド名となります。 その値は配列で、必須のキー 'type' と、 'type' の値にもとづいたその他のキーで構成されます。 'type' キーの値は、MDB2 のデータ型と同じものです。 データ型によって、その他のオプションは変化します。

createTable() の三番目のパラメータは、 そのテーブルの別のオプションです。 文字セットや照合順序、その他 RDBMS 固有のプロパティ (MySQL のテーブルエンジンなど) を指定します。 MySQL の場合の例を以下に示します。
サンプルデータベースの仕上げとして、 event_participants テーブルを作成するコードを示します。

制約の作成

サンプルデータベースのテーブルでは、id が主キーでなければなりません。 主キーを作成するために使用するのが createConstraint() メソッドです。このメソッドのパラメータは、テーブル名と 制約名、そして定義配列の三つです。

配列 definition の完全な構造は、このようになります (これは、外部キー制約を表すものです)。
<?php
$definition = array (
    'primary' => false,
    'unique'  => false,
    'foreign' => true,
    'check'   => false,
    'fields' => array (
        'field1name' => array(), // ひとつのエントリがひとつのフィールドに対応します
        'field2name' => array(), // フィールドの並び順とあわせます
        'field3name' => array(
            'sorting'  => ascending|descending,
            'position' => 3,
        ),
    )
    'references' => array(
        'table' => name,
        'fields' => array(
            'field1name' => array( // ひとつのエントリがひとつの参照フィールドに対応します
                'position' => 1,
        ),
    )
    'deferrable' => false,
    'initiallydeferred' => false,
    'onupdate' => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION,
    'ondelete' => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION,
    'match' => SIMPLE|PARTIAL|FULL,
);
?>
注意: RDBMS によっては、制約名を無視するものもあります。たとえば MySQL では、主キーを作成する際には メソッドコール時に指定した keyname の値を使用せず、PRIMARY を使用します。 また、外部キーを作成する際にも メソッドコール時に指定した keyname の値を使用せず、[tablename]_ibfk_[n] を使用します。

定義配列では、制約にどのフィールドを含めるのかを fields キーで指定します。 定義配列で使用できるその他のキーは primaryunique でこれらは boolean 値となります。

別のキーを event_participants で作成してみましょう。 これは、各行が一意でなければならない、つまり、 ある人間がひとつのイベントには一度しか参加しないというものです。 定義配列の fields には両方のフィールドを指定し、 unique キーを true に設定します。

インデックスの作成

インデックスを作成するには createIndex() メソッドを使用します。このメソッドのシグネチャは createConstraint() と同じです。つまり、 テーブル名とインデックス名そして定義配列を指定します。 定義配列のキーはひとつ、fields で、 その値は連想配列となります。この連想配列には、 インデックスを構成するフィールドが含まれます。 フィールド情報は配列で指定し、そのキーは以下のようになります。

インデックスの並べ替えや長さをサポートしていない RDBMS もあります。 そのような場合は、ドライバはこの値を無視します。サンプルの events データベースを使用するアプリケーションは、 指定した期間内のイベントを表示するものとします。 つまり、select の WHERE 条件として datetime フィールドを使用するわけです。 このフィールドにインデックスが設定してあると、その助けになるでしょう。

シーケンスの作成

MDB2 がシーケンスを処理する方法については、 こちら を参照ください。今回のサンプルデータベースの events テーブルでは、 'id' を自動インクリメントさせる必要があります。そのために使用するメソッドが nextId() で、これはシーケンスの次の値を取得します。 nextId() は、もしシーケンステーブルがなければ作成します。 しかし、事前にそれを createSequence() で作成しておくこともできます。このメソッドには、シーケンス名のほかに オプションでシーケンスの開始値を指定します。
デフォルトの MDB2 の設定では、上の例は 二つのテーブル events_seq および people_seq を作成します。 それぞれのテーブルについて、ひとつのフィールド 'sequence' が存在します。しかし、このフィールド名やテーブル名の最後の '_seq' は変更可能です。変更するには、MDB2 のオプション seqname_format および seqcol_name を使用します。

データベースのテーブルの変更

一度作成したテーブルに対して、テーブルの名前の変更やフィールドの追加、削除、 名前の変更などを行うには alterTable() メソッドを使用します。alterTable() には三つのパラメータを指定します。それぞれテーブル名、 変更内容の定義そして boolean の "check-only" フラグとなります。 このフラグを true にすると、実際の変更は行われません。 指定した変更が、その RDBMS およびテーブルで実行可能かどうかのみを調べます。 二番目の引数 (変更内容の定義) は、これらのキーを持つ配列です。

add/remove/change/rename キーの値は、それぞれ微妙に異なる構造となります。 しかし、いずれについてもフィールド定義を含みます。 詳細な情報や使用例は、 API ドキュメント を参照ください。

データベース要素の一覧

データベース内に何があるかを見るには、list*() 系の関数を使用します。すなわち、以下のような関数です。

データベース要素の削除

上に示したすべての create*() 系メソッドについて、 対応する drop*() 系メソッドが存在します。これらによって、 データベースやテーブル、フィールド、インデックスあるいは制約を削除することができます。 drop*() 系のメソッドは、削除対象の項目が存在するかどうかをチェックしません。 したがって、結果が PEAR error であるかどうかを確認するようにしてください。