データベースの更新
スキーマを利用してデータベースの内容を更新または削除するには、updateおよびdeleteテーブル初期化メソッドを使用します。ご想像どおり、これらのメソッドはデータベースを最初に作成するときに、対象テーブル内の条件に一致した行のフィールド値を置き換えたり、行を削除したりします。
次に紹介する例では、updateDatabaseメソッドを使用してbookstoreデータベースを更新します。updateDatabaseメソッドのプロトタイプは次のとおりです。
bool|MDB2_Error updateDatabase( string|array $current_schema, [string|array $previous_schema = false], [array $variables = array()], [bool $disable_query = false], [ $overwrite_old_schema_file = false])
このメソッドは、2つのバージョンのデータベーススキーマ定義を比較します。つまり、インストールされているデータベースのスキーマ定義と、以前のデータベース定義を更新するために用いるスキーマ定義です。以前のデータベースの定義ファイルが存在しない場合は、現在のスキーマファイル内で指定された定義に基づいてデータベースが作成されます。引数$current_schemaは新しいデータベーススキーマ定義のファイル名(または配列)を表し、引数$previous_schemaは以前からインストールされているデータベーススキーマを定義するファイル名(または配列)を表します。引数$variablesは、parseDatabaseDefinitionFile関数の引数$variablesに引き渡される連想配列を表します。引数$disable_queryは、alterDatabase()メソッドまたは createDatabase()メソッドのdisable_queryオプションをtrueに設定するかどうかを決定します(デフォルトはfalse)。
alterDatabase()メソッドはSQLのALTER DATABASE文とまったく同じ働きをします。
次に示すアプリケーションはbookstoreデータベースに対して、全レコードのidフィールドを変更し、最終レコードを削除するという更新を行います。この例では、「データベースのダンプ」の節で生成したドキュメント「all.xml」に少し手を加えたものを使用しています。修正後のスキーマ定義をリスト7に示します。アプリケーションのコードは次のとおりです。
<?php
// Include class
include_once 'MDB2/Schema.php';
//initialize an MDB connection to the database
$schema = MDB2_Schema::factory(
MDB2::factory('mysql://root@localhost/bookstore'));
// Update database
$operation = $schema->updateDatabase(
allnew.xml',all.xml');
if ($operation instanceof MDB2_Error){
die ($operation->getMessage());
} else {
echo 'Database successfully updated. <br />';
}
?>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<database>
<name>bookstore</name>
<create>true</create>
<overwrite>true</overwrite>
<charset></charset>
<table>
<name>books</name>
<declaration>
<field>
<name>id</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<autoincrement>1</autoincrement>
<length>4</length>
</field>
<field>
<name>title</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>50</length>
</field>
<field>
<name>author</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>50</length>
</field>
<field>
<name>yearofpublication</name>
<type>integer</type>
<default></default>
<notnull>false</notnull>
<length>4</length>
</field>
<field>
<name>publisher</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>50</length>
</field>
<field>
<name>price</name>
<type>integer</type>
<default></default>
<notnull>false</notnull>
<length>4</length>
</field>
</declaration>
<initialization>
<insert>
<field>
<name>id</name>
<value>1</value>
</field>
<field>
<name>title</name>
<value>Annabel Lee</value>
</field>
<field>
<name>author</name>
<value>Edgar Allan Poe</value>
</field>
<field>
<name>yearofpublication</name>
<value>1849</value>
</field>
<field>
<name>publisher</name>
<value>The Literature Page</value>
</field>
<field>
<name>price</name>
<value>26</value>
</field>
</insert>
<insert>
<field>
<name>id</name>
<value>2</value>
</field>
<field>
<name>title</name>
<value>The Ballad of Reading Gaol</value>
</field>
<field>
<name>author</name>
<value>Oscar Wilde</value>
</field>
<field>
<name>yearofpublication</name>
<value>1898</value>
</field>
<field>
<name>publisher</name>
<value>The Literature Page</value>
</field>
<field>
<name>price</name>
<value>45</value>
</field>
</insert>
<insert>
<field>
<name>id</name>
<value>3</value>
</field>
<field>
<name>title</name>
<value>The Sonnets</value>
</field>
<field>
<name>author</name>
<value>Edgar Allan Poe</value>
</field>
<field>
<name>yearofpublication</name>
<value>1602</value>
</field>
<field>
<name>publisher</name>
<value>The Literature Page</value>
</field>
<field>
<name>price</name>
<value>34</value>
</field>
</insert>
<update>
<field>
<name>price</name>
<expression>
<column>price</column>
<operator>TIMES</operator>
<value>10</value>
</expression>
</field>
</update>
<delete>
<where>
<expression>
<column>id</column>
<operator>EQUAL</operator>
<value>3</value>
</expression>
</where>
</delete>
</initialization>
</table>
</database>
この記事ではいくつかの例を通して、ツールを使ってデータベーススキーマを操作する基本的な方法を紹介しました。既にお気づきでしょうが、使い方はごく簡単で、柔軟性も高く、ベータ版にもかかわらずかなりの完成度です。このPEARパッケージが今後どう発展していくか、そして最初の安定版リリースにどんな機能が搭載されるのか、非常に楽しみなところです。
