Reverse モジュール

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

Description

Reverse モジュールは、 Common モジュールドライバ を拡張したもので、次のような構成になっています。

  • リバースドライバクエリを実行する際に使用する API をカプセル化した、 Common ドライバファイル
  • 個々のデータベースバックエンドに対応した、DBMS 固有のドライバ群 (たとえば MySQL 用の mysql.php や PostgreSQL 用の pgsql.php など)

使用法

MDB2 の Reverse ドライバを使用するには、まず Reverse ドライバを MDB2 のインスタンスに読み込む必要があります。 まずは MDB2 のインスタンスを作成し、接続を確立しましょう。

Reverse モジュールの読み込み

<?php
// MDB2 基底クラスを読み込みます
require 'MDB2.php';

// データベースに接続するための DSN を定義します
$dsn = array(
    
'phptype' => 'mysql',
    
'username' => 'someuser',
    
'password' => 'somepass',
    
'hostspec' => 'somehost',
    
'database' => 'somedb',
);

// MDB2 インスタンスを作成します
// MDB2 にはいくつかの接続方法があります - singleton()、factory() そして connect() です
$mdb2 = &MDB2::connect($dsn);
if(
PEAR::isError($mdb2)) {
    
// 何らかの理由で失敗した場合は、メッセージを表示して終了します
    
die($mdb2->getuserinfo());
}
// 正しく接続できたので、処理を進めましょう!
// MDB2 の loadModule メソッドで、Reverse モジュールを読み込みます
$mdb2->loadModule('Reverse'nulltrue);
?>

上の例では、既存のデータベースへの有効な接続を作成するために、 データベースサーバへの有効なユーザ名とパスワードを使用しています。 これで、サンプルアプリケーション内で MDB2 Reverse 機能のすべてを使用できるようになりました。 このドキュメントで使用するためのテーブルを、このように作成します。

テーブルの作成

<?php
// 操作するテーブルの名前を定義します
$fields = array(
    
'id' => array(
        
'type' => 'integer',
        
'unsigned' => true,
        
'autoincrement' => true,
    ),
    
'somename' => array(
        
'type' => 'text',
        
'length' => 12,
    ),
    
'somedate' => array(
        
'type' => 'date',
    ),
);
$table 'sometable';
// テーブルの作成
// Manager モジュールを読み込みます
$mdb2->loadModule('Manager'nulltrue);
// Manager モジュールでテーブルを作成します
$mdb2->manager->createTable($table$fields);
?>

getTableFieldDefinition() メソッド

getTableFieldDefinition() メソッドの目的は、 テーブルのフィールド定義情報を配列で取得することです。 この配列を使用すると、別の場所で同じテーブルを作成したり その他必要に応じて使用できます。先ほど定義した MDB2 インスタンスを用いてデータベースに接続し、 対象となるテーブルを作成し、調べたい特定のフィールドをリバースエンジニアリングします。 まず、対象となるテーブルとフィールドを定義する必要があります。 そうすれば、たった一行コードを書くだけでテーブル定義を配列として取得できるようになります。 それから、var_dump で結果を表示しています。

テーブル定義の取得

<?php
// リバースエンジニアリング (定義の取得) を行いたいフィールドを設定します
$field 'somedate';

// テーブルのフィールド定義を取得し、変数に保存します。
// 返り値は、成功した場合は配列、失敗した場合は MDB2 error となります。
// そこで、ここでは追加のチェックは必要ありません。
$def $mdb2->getTableFieldDefinition($table$field);
// 最後に結果を画面に出力します
var_dump($def);
?>

フィールド定義に依存しますが、返される結果は次のようになるでしょう。

<?php
array(1) {
  [
0] => array(5) {
    [
'notnull'] => bool(false)
    [
'nativetype'] => string(4"date"
    
['default'] => NULL
    
['type'] => string(4"date"
    
['mdb2type'] => string(4"date"
  
}
}
?>

テーブルの付加情報

これ以外にもさまざまなメソッドがあり、選択したテーブルについての情報を取得することができます。 以下のメソッドのいずれかを、ほしい情報に応じて使用しましょう。

  • getTableIndexDefinition(): テーブル名とインデックス名を指定すると、 テーブルのインデックスについての情報を配列で返します。
  • getTableConstraintDefinition(): テーブル名を指定し、制約の情報を問い合わせます。 これは、指定したテーブル上のすべての制約の定義を返します。 ここで言う「制約」とは、通常は主キーやユニークキー、そして外部キーのことです。 返される配列の構造は、 Manager モジュールcreateConstraint() で用いるものと同じです。
  • getSequenceDefinition(): シーケンス名を指定し、既存のテーブルのシーケンスについての情報を返します。 このメソッドは、成功した場合に配列、失敗した場合に MDB2 error を返します。
  • getTriggerDefinition(): トリガ名を引数として受け取り、そのトリガについての情報を配列で返します。

tableInfo() メソッド

このメソッドは、テーブルに関する多くの情報を返します。 さまざま場面で使用することができます。 返される情報の内容は RDBMS によって微妙に異なり、結果の形式も変わってきます。 このメソッドは、テーブル定義のほかに結果セットに対して使用することもできます。 これは、最適化されたテーブルを作る際に便利です。 tableInfo() メソッドのパラメータには、 結果をどのように表すかを指定するためのモードを渡すことができます。 結果がどのようになるのかをよりわかりやすくするため、 同じクエリを使用して結果を異なるモードで出力する一連の例をごらんいただきます。 注意: 最初のパラメータには、テーブルあるいは結果セットのいずれかを指定して情報を取得することができます。 これらの例では、先ほど定義したテーブルを使用します。

tableinfo() の使用例 1

<?php
// デフォルトのモード - NULL
$tableInfo $mdb2->tableInfo($tableNULL);
var_dump($tableInfo);

// 結果は、このようになります
array(3) {
  [
0] => array(11) {
    [
'notnull'] => bool(true)
    [
'nativetype'] => string(3"int"
    
['length'] => int(4)
    [
'unsigned'] => int(1)
    [
'default'] => string(0""
    
['autoincrement'] => bool(true)
    [
'type'] => string(3"int"
    
['mdb2type'] => string(7"integer"
    
['name'] => string(2"id"
    
['table'] => string(9"sometable"
    
['flags'] => string(29"primary_key not_null unsigned"
  
}
  [
1] => array(10) {
    [
'notnull'] => bool(false)
    [
'nativetype'] => string(7"varchar"
    
['length'] => string(2"12"
    
['fixed'] => bool(false)
    [
'default'] => NULL
    
['type'] => string(7"varchar"
    
['mdb2type'] => string(4"text"
    
['name'] => string(8"somename"
    
['table'] => string(9"sometable"
    
['flags'] => string(0""
  
}
  [
2] => array(8) {
    [
'notnull'] => bool(false)
    [
'nativetype'] => string(4"date"
    
['default'] => NULL
    
['type'] => string(4"date"
    
['mdb2type'] => string(4"date"
    
['name'] => string(8"somedate"
    
['table'] => string(9"sometable"
    
['flags'] => string(0""
  
}
}
?>

これ以降の例では、最初のテーブルフィールドの定義のみを含めます。 モードごとの違いを示すには、それで十分だからです。 さあ、ではモードを MDB2_TABLEINFO_ORDER に変更してみましょう。 デフォルトの出力で得られた情報に加えて、カラム数についての情報が num_fields 要素で返されます。また、order 要素の配列の構造は、キーがカラム名、値がそのカラムのインデックス (デフォルトの出力のキーに対応します) となります。

tableinfo() の使用例 2

<?php
$tableInfo 
$mdb2->tableInfo($tableMDB2_TABLEINFO_ORDER);
var_dump($tableInfo);

array(
5) {
  [
'num_fields'] => int(3)
  [
0] => array(11) {
    [
'notnull'] => bool(true)
    [
'nativetype'] => string(3"int"
    
['length'] => int(4)
    [
'unsigned'] => int(1)
    [
'default'] => string(0""
    
['autoincrement'] => bool(true)
    [
'type'] => string(3"int"
    
['mdb2type'] => string(7"integer"
    
['name'] => string(2"id"
    
['table'] => string(9"sometable"
    
['flags'] => string(29"primary_key not_null unsigned"
  
}
  [
1] => array(10) {
    [
'notnull'] => bool(false)
    [
'nativetype'] => string(7"varchar"
    
['length'] => string(2"12"
    
['fixed'] => bool(false)
    [
'default'] => NULL
    
['type'] => string(7"varchar"
    
['mdb2type'] => string(4"text"
    
['name'] => string(8"somename"
    
['table'] => string(9"sometable"
    
['flags'] => string(0""
  
}
  [
2] => array(8) {
    [
'notnull'] => bool(false)
    [
'nativetype'] => string(4"date"
    
['default'] => NULL
    
['type'] => string(4"date"
    
['mdb2type'] => string(4"date"
    
['name'] => string(8"somedate"
    
['table'] => string(9"sometable"
    
['flags'] => string(0""
  
}
  [
'order'] => array(3) {
    [
'id'] => int(0)
    [
'somename'] => int(1)
    [
'somedate'] => int(2)
  }
}
?>

モードを MDB2_TABLEINFO_ORDERTABLE に変更すると、 さらに情報が追加されます。返り値の配列の次元数がひとつ多くなり、 テーブル名をキー、そのフィールド名をサブキーとする構成になります。 この型のクエリが有用なのは、たとえば複雑な結合を行っており、 同名のフィールドが複数ある場合などです。

注意: flags 要素には、フィールドに関する付加情報が スペース区切りの一覧で含まれます。この内容には、DBMS 間での一貫性はありません。 それぞれの DBMS に依存し、次のような内容になります。

  • primary_key
  • unique_key
  • multiple_key
  • not_null
  • unsigned

大半の DBMS では、結果がテーブル名の場合は table および flags しか返しません。 オプション portabilityMDB2_PORTABILITY_FIX_CASE に設定されている場合は、テーブルおよびフィールドの名前は小文字あるいは大文字に変換されます。 CASE_UPPER の場合は、すべてのテーブルおよびフィールドは大文字に変換されます。 これは Oracle や Firebird/Interbase と同じ挙動です。一方、 CASE_LOWER の場合はすべてのテーブルおよびフィールドを小文字に変換します。 これがデフォルトの設定です。

データベースの構造を管理するためのモジュール (Previous) SQL 文を自動的に準備・実行する (Next)
Last updated: Mon, 15 Sep 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: willbickerstaff@mailshack.com
Depending on the state of MDB2_PORTABILITY_FIX_CASE
You may need to modify the case of your column arg for getTableFieldDefinition.

$def = $mdb2->getTableFieldDefinition($table, strtolower($field));

Not sure why this is the case, as the query performed will also have the col name modified, but works. while without the SHOW FULL COLUMNS query fails with Not Found.