SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

PHPのMDB2_Schemaを使ってデータベーススキーマをXMLベースで管理する

データベースの更新

 スキーマを利用してデータベースの内容を更新または削除するには、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 />';
}
?>
リスト7 Allnew.xmlスキーマ
<?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パッケージが今後どう発展していくか、そして最初の安定版リリースにどんな機能が搭載されるのか、非常に楽しみなところです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Octavia Andreea Anghel(Octavia Andreea Anghel)

経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3115 2008/11/06 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー