WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [symfony] propelで複数の接続を使う時の問題点

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

propelで複数の接続を使うには制約があります。
http://www.symfony-project.org/snippets/snippet/194

symfonyではDBの接続をconfig/databases.ymlに設定します。
ここに複数の設定を書けばプログラムから複数の接続を使えます。


all:
database1:
class: sfPropelDatabase
param:
phptype: mysql
hostspec: localhost
database: mysql_databse
username: my_username

database2:
class: sfPropelDatabase
param:
phptype: sqlite
database: ../data/sqlite_database.db

スキーマはconfigフォルダの*schema.xmlと名前がついたものはすべて読み込まれるので
database1-schema.xml
database2-schema.xml
を作ってそれぞれ頭に接続を指定します。この時モデル(ORMクラス)を作成するパスをpackageで指定すると、管理がしやすくなります。

database1-schema.xml
database1:
_attributes: { package: lib.model.database1}
table1:
id:
.......

database2-schema.xml
database2:
_attributes: { package: lib.model.database2}
table2:
id:
.......

これで
symfony propel-build-model
すれば適正なモデルがそれぞれ
lib/model/database1/
lib/model/database2/
に作成されます。ただ、問題は
symfony propel-build-sql
symfony propel-insert-sql
です。これらのタスクはconfig/propel.iniを見に行きます。接続毎に違うiniファイルを見に行かせることができません。最初の接続のsqlを流し込んだ後、手動でiniファイルを入れ替えて、またsqlを流し込むという作業が必要です。

ちなみにdoctrineを使用すればもっと簡単に複数の接続を使えるようです。公式のチュートリアルでも複数の接続を使う時はdoctrineを使うように進めています。

また、もう一つ問題があります。接続名ですが上記のような設定をしても動きますが、pluginでDBにテーブルを作るようなもの、例えばsfGuardPluginなどは接続名にpropelを使用しています。スキーマファイルを書き換えてやれば動きますが、アップデイトのたびに変えてやらなければならないので、メインのDBの名前はpropelにしておいたほうが無難です。

1.2のdoctrineのマニュアルを読んでいたら次のような記述を見つけました。

Though Propel requires at least one connection named propel, Doctrine does not require that the connection be named doctrine so you can name it whatever you like.
Propelは最低でも一つのpropelという名前の接続が必須でしたが、Doctrineはdoctrineという名前の接続が必須ではありませんので、好きな名前をつけられます。



[symfony 1.1.6]
スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。