SEO対策ならSEO knowledge

TOPプログラムPHP>symfony

Symfonyで複数のDBに接続するための設定箇所一覧

①databases.ymlの書き方

config/databases.yml

all:
  propel_db1:
    class:          sfPropelDatabase
    param:
      dsn:          mysql://{DB1ログインID}:{DB1ログインID}@localhost///{DB1データベース名}

  propel_db2:
    class:          sfpropelDatabase
    param:
      dsn:          mysql://{DB2ログインID}:{DB2ログインID}@localhost/{DB2データベース名}


②schema.ymlの書き方

違う名前で2つ分けて作る

propelのpackageを指定しないと

symfony propel-build-sqlの時に以下のようなエラーが発生するので注意


PHP Fatal error:  Call to a member function addTable() on a non-object in /usr/share/pear/symfony/vendor/propel-generator/classes/propel/phing/PropelSQLTask.php on line 233



ちなみにsymfony propel-build-modelすると、ここで指定したpackage名のディレクトリの下にモデルが作られる

config/db1.schema.yml

propel_db1: # database.ymlに書いたpropel名と合わせる\\
  _attributes: { package: lib.model.db1 } # 作成されるsql名を指定\\

  table1: 
    id: 
      type: INTEGER
      required: true
      autoIncrement: true
      primaryKey: true
    title: 
      type: VARCHAR
      size: 255


・・・

config/db2.schema.yml

propel_db2: #database.ymlに書いたpropel名と合わせる\\
  _attributes: { package: lib.model.db2 }#作成されるsql名を指定\\

  table2: 
    id: 
      type: INTEGER
      required: true
      autoIncrement: true
      primaryKey: true
    title: 
      type: VARCHAR
      size: 255


・・・

③propel.iniの書き方

propel.iniに関しては「propel.ini」というファイル名のファイルがないとsymfony propel-build-sql
などでエラーが返ってくるので注意が必要

なのでファイル名を
propel.ini
propel_db2.ini
などとしておくとよいかも(propel.iniさえあればあとのファイル名はなんでもいい)


config/propel.ini

propel.targetPackage       = lib.model.db1
propel.packageObjectModel  = true
propel.project             = {プロジェクト名}
propel.database            = mysql
propel.database.createUrl  = mysql://{DB1ログインID}:{DB1ログインID}@localhost/
propel.database.url        = mysql://{DB1ログインID}:{DB1ログインID}@localhost/{DB1データベース名}

・・・

config/propel_db2.ini

propel.targetPackage       = lib.model.db2
propel.packageObjectModel  = true
propel.project             = {プロジェクト名}
propel.database            = mysql
propel.database.createUrl  = mysql://{DB2ログインID}:{DB2ログインID}@localhost/
propel.database.url        = mysql://{DB2ログインID}:{DB2ログインID}@localhost/{DB2データベース名}


・・・


④test_data.ymlの書き方

以下のようにディレクトリを分ける必要がある

data/fixtures/db1/test_data.yml
data/fixtures/db2/test_data.yml



⑤load_data.phpの書き方

普通は最後の行(loadData)は一行だが、複数接続の場合は以下のように2行書くか、loadする動作を分けたければload_dataファイルを二つ作る必要がある

batch/load_data.yml

・・・

$data->loadData(sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'fixtures' . DIRECTORY_SEPARATOR . 'db1', 'propel_db1');
$data->loadData(sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'fixtures' . DIRECTORY_SEPARATOR . 'db2', 'propel_db2');



※注釈
上の設定をしないでいつもどおりphp batch/load_data.php
を実行すると以下のようなエラーが出る



PHP Fatal error:  Uncaught exception 'PropelException' with message 'No connection params set for propel' in /usr/share/pear/symfony/vendor/propel/Propel.php:476
Stack trace:
thrown in /usr/share/pear/symfony/vendor/propel/Propel.php on line 476

Fatal error: Uncaught exception 'PropelException' with message 'No connection params set for propel' in /usr/share/pear/symfony/vendor/propel/Propel.php:476\\
Stack trace:
thrown in /usr/share/pear/symfony/vendor/propel/Propel.php on line 476




/usr/share/pear/symfony/addon/propel/sfPropelData.class.php

の39行目を見てみると

public function loadData($directory_or_file = null, $connectionName = 'propel')
{
$fixture_files = $this->getFiles($directory_or_file);
// wrap all database operations in a single transaction
$con = Propel::getConnection($connectionName);//←39行目
try
{
$con->begin();
$this->doDeleteCurrentData($fixture_files);
$this->doLoadData($fixture_files);
$con->commit();
}
catch (Exception $e)
{
$con->rollback();
throw $e;
}
}


loadData関数の第二引数がないときにデフォルトで$connectionName = 'propel'とされていることがわかるので、第二引数に設定したpropel名を渡せばエラーが出なくなる。



④symfony propel-insert-sqlについて

エラーが出るので代わりに以下のコマンドを打ちましょう

mysql -u root -p db1 < data/sql/lib.model.db1.schema.sql
mysql -u root -p db2 < data/sql/lib.model.db2.schema.sql



公式ドキュメントではコマンドを打つたびにpropel.iniを書き換えろとあるのですが、さすがに面倒なので却下。
http://www.symfony-project.com/snippets/snippet/194

 このエントリをはてなブックマークに登録 このエントリをlivedoorクリップに登録 Yahoo!ブックマークに登録 このエントリを del.icio.us に登録 Google Bookmarks に追加
[ 新規 | 編集 | 削除 | 凍結 ]    [ 新着 | 履歴 | ヘルプ ]

この記事に関連する求人

携帯サイト

携帯サイトはこちら

QRコード

http://it.kndb.jp/m

記事を書く

関連エントリ

関連ブックマーク

ページ上部へ