2009.01.14/Wed 12:11:13
propelで複数の接続を使うには制約があります。
http://www.symfony-project.org/snippets/snippet/194
symfonyではDBの接続をconfig/databases.ymlに設定します。
ここに複数の設定を書けばプログラムから複数の接続を使えます。
スキーマはconfigフォルダの*schema.xmlと名前がついたものはすべて読み込まれるので
database1-schema.xml
database2-schema.xml
を作ってそれぞれ頭に接続を指定します。この時モデル(ORMクラス)を作成するパスをpackageで指定すると、管理がしやすくなります。
これで
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のマニュアルを読んでいたら次のような記述を見つけました。
[symfony 1.1.6]
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]
category: symfony
go page top

