既に存在するデータベース

以下のトピックは既に動いているデータベースがあってPropelをデータ復元も含めて一緒に使いたい開発者向けです。

PropelにはPhingのXMLビルドファイルの関数として定義されていて既に存在するためのデータを扱うためのいくつかのターゲット(target)があります。


重要な注意点

Propel 1.3はPDOをruntimeのデータベースのアクセスに使っていますが、データベースをリバースエンジニアリングする際にはCreoleを使っています。PDOとCreoleはDSNのフォーマットが違うので、データベースをリバースエンジニアリングする場合は追加のbuild属性を指定する必要があります。


始める前に

既に存在するデータベースをインポートする前に、Propelがきちんとインストールされている必要があります。ユーザーガイド内のインストールチャプターに詳細なPropelのインストール方法がありますので、そちらを参考にしてください。特にCreoleパッケージをインストールするのを忘れないでください。

このドキュメントではPEARインストールのPropelを使って既に存在するデータベースで作業する方法を説明しています。この方法をSubversionインストールなど他のPropelのインストールにあてはめることも可能です。

以下の例はUnix/Linuxシステム用のものですが、Windows用にも簡単に変えることができるはずです。

データベース構造への作業

Propelでは抽象化されたXMLスキーマを使ってデータベースを記述します。Propelはそのスキーマから各データベースに合ったSQLを生成します。Propelはまたデータベースのメタデータを元にリバースエンジニアリングを行い、スキーマファイルを生成することができます。PropelはCreoleパッケージのリバースエンジニアリングの機能を使いこのタスクを行います。

データベース構造からのXMLスキーマ生成

Propelビルドファイルののcreoleターゲットは既に存在するデータベースを元にスキーマを生成するために使われます。このターゲットはCreoleのデータベース抽象化レイヤーのメタデータクラスを使いデータベースに関する情報を取得します。

注意: Creoleのメタデータクラスを使って全てのデータベースから同じレベルの詳細を抽出することはできません。特にSQLiteはtypelessなデータベースであるため、SQLiteのメタデータはとても基本的なものでしかありません。

スキーマーファイルを生成するには、プロジェクト内に新しいディレクトリを作り、build.propertiesファイル内に接続関係の情報を指定します。例えば、新しいプロジェクトlegacyappを作るには以下のステップを踏んでください:

  1. legacyappプロジェクトディレクトリをファイルシステムのどこかに作ります:
    $> mkdir legacyapp
    $> cd legacyapp
    
  2. build.propertiesファイルをlegacyappディレクトリ内に作って、既に存在するデータベースに対するパラメーターを指定します。例えば:
    propel.project = legacyapp
    
    # SQLを生成するのに使うPeopelドライバなど
    propel.database = mysql
    
    # ここは(PDOではなく!)Creole DSNを指定します
    propel.database.creole.url = mysql://root@localhost/legacyapp
    
  3. schema.xmlを生成するための、creoleターゲット走らせます:
    $> propel-gen ./ creole
    
  4. ここでPhingがターゲットを実行する際に出すエラー/ワーニングに注意して、生成されたschema.xmlをよく見て、変更が必要かどうかを調べます。
  5. これでおしまいです'''これでschema.xmlファイルがlegacyappディレクトリにできました。このあとデフォルトのPropelビルドを使って、全てのクラスを生成してください。

生成されたschema.xmlファイルはガイドとして使うことができますが、最終的な答えではありません。Propelはいくつかのデータタイプについてはよく知らないかもしれません。あるいはデータタイプによってはPropelがサポートしていないものもあります(例えばPostgreSQLの配列)。もし特定のRDBMSだけにしか存在しない機能を多用している場合、Propelを使うかどうかを再検討する必要があります。

新しいRDBMSに構造を移行する

Propelを使うことで、既に存在するデータベース構造からXMLスキーマを作り、そのXMLスキーマから特定のRDBMSに対するDDL SQLを作ることができるため、Propelを使ってデータベースを違うデータベースへ移行するツールとして使うことができます。

このためにはこの2つを行うだけでokです:

  1. 上のステップを元にschema.xmlファイルを作成します。
  2. そしてbuild.propertiesで新しいデータベースプロジェクト用にターゲットデータベースタイプとデータベースに接続URLを変更します:
    propel.database = pgsql
    propel.database.url = pgsql://unix+localhost/newlegacyapp
    
  3. そしてsqlビルドターゲットを実行して新しいDDLを生成します:
    $> propel-gen ./ sql
    
  4. (必要であれば)insert-sqlターゲットを実行して、新しいデータベースを作ります:
    $> propel-gen ./ insert-sql
    

データベースのデータへの作業

Propelにはデータベースのデータのためのいくつかのターゲットが存在します。最も重要なのはdatadumpdatasqlです。最初のターゲットはデータをXMLにダンプし、次のターゲットはXMLデータダンプを挿入できるSQLファイルに変換します。

重要:どちらのターゲットを走らせるのにもデータベースからschema.xmlがすでに生成されている必要があります。

XMLへのデータダンプ

schema.xmlを生成(リバースエンジニアリング)した後、datadumpタスクを実行してデータベースのでーたをdata.xmlファイルにダンプします。

例えばbookstore-test.phpスクリプトを実行する際にデータがデータベースに追加されます。もしクリーンアップオペレーションが実行される前にスナップショットを取る場合、データはテーブル内に残っているはずです。このデータをdata.xmlファイルにアウトプットするには、以下を実行します:

$> propel-gen ./ datadump

publisherテーブルではこのような列があります:

publisher_idname
1William Morrow

生成されたdata.xmlファイルにはその列はこの様に書き込まれます:

<dataset name="all">
 ...
  <Publisher PublisherId="1" Name="William Morrow"/>
 ...
</dataset>

XMLからSQLを作る

XMLからSQLを作るにはdatasqlタスクを実行します:

$> propel-gen ./ datasql

生成されたSQLはbuild/sql/ディレクトリに保存され、insert-sqlターゲットが実行されたときに挿入されます。