2

Propelを使い始めたばかりで、気に入っていますが、複数のデータベース接続を利用する方法について質問があります。複数の異なるデータベースに接続するためにスキーマに設定できることは知っていますが、これをコードで処理する方法に興味があります。

私が抱えている問題は複数のデータベースであり、それぞれのスキーマはわずかに異なり、データウェアハウスはありません。その結果、私は次のようなものを持っています:

databaseName: westCoastUsers
table: users
column1: email
column2: password
column3: FirstName

databaseName: eastCoastUsers
table: users
column1: email
column2: password
column3: firstName
column4: lastName

現在、PHPの非Propelバージョンでは、これらすべてを手動で行っており、必要に応じてデータベースを手動で切り替えています。私は物事を少し合理化することを望んでいます、そして私はこれをどのようにモデル化するか興味があります。それぞれが適切なデータベースなどを参照するeastCoastUserモデルやwestCoastUserモデルのようなものを作成する方法はありますか、それともサポートされていないものにくさびを入れようとしていますか?

私はこれを読みました:propelで2つのデータベースを使用する方法ですが、コードで実際にそれを実行する方法がわかりません。

助けてくれてありがとう

4

2 に答える 2

2

スキーマファイルで、テーブルを表すクラスの名前を指定できます。テーブルと同じ名前を使用する必要はありません。これはphpName、テーブル要素の属性を使用して行います。

たとえば、schema.xmlには次のようなものを含めることができます

<database name="westCoastUsers">
  <table name="users" phpName="WestCoastUser">
    ...columns here...
  </table>
  ...
</database>
<database name="eastCoastUsers">
  <table name="users" phpName="EastCoastUser">
    ...columns here...
  </table>
</database>

name="westCoastUser"(編集、データベース要素のは、類似した名前のクラスではなく、データベースの名前を参照していることに注意してください)

次に、ビルド時に、propelは、、、、、および、WestCoastUserWestCoastUserQuery生成します。各クラスは、スキーマで定義されたデータベースを使用して接続します。WestCoastUserPeerEastCoastUserEastCoastUserQueryEastCoastUserPeer

于 2012-07-02T16:32:55.623 に答える
1

私はもともとsymfony1.2のためにこれを書きましたが、それはすべて当てはまると思います。

この例ではSymfony1.2.4を使用しています。マスターとスレーブの2つのデータベースがあります。

複数のデータベースを使用する場合は、実行する必要のあることがいくつかあります。

You will need separate schema files for both (master.schema.yml and slave.schema.yml)
To use build-sql and insert-sql, you will need multiple propel.ini files
You will need to add an attribute to your schema files to get them to build right

ステップ1

2つの別々の接続でdatabases.ymlを作成します。

dev:
  propel:
  param:
  classname: DebugPDO

test:
  propel:
  param:
  classname: DebugPDO

all:
  propel:
  class: sfPropelDatabase
  param:
  classname: PropelPDO
  dsn: mysql:dbname=master;host=xxx.xxx.xxx.xxx
  username: uname
  password: pass
  encoding: utf8
  persistent: true
  pooling: true

master:
  class: sfPropelDatabase
  param:
  classname: PropelPDO
  dsn: mysql:dbname=slave;host=xxx.xxx.xxx.xxx
  username: uname
  password: pass
  encoding: utf8
  persistent: true
  pooling: true

ステップ2

前述のように、2つのスキーマファイルが必要になります。テーブルに一致するデータベースのパッケージ属性を定義する必要があることに注意してください。この場合、マスター接続の場合は「lib.model.master」です。

master.schema.yml

master:
  _attributes:
  package: lib.model.master
  defaultIdMethod: native
my_table:
  _attributes: { package: lib.model.master }
  my_id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }

等.....

slave.schema.yml

slave:
 _attributes:
 package: lib.model.slave
 defaultIdMethod: native
 auctionp:
 _attributes: { package: lib.model.slave }

等.....

ステップ3

個別のpropel.iniファイルを作成する必要があります。この例では、propel-master.iniとpropel-slave.iniを使用しました。これらの各ファイルは、それぞれのデータベース用に構成する必要があります。

ステップ4

推進ツールを使用してデータベースを構築するには、適切なバッチファイルが必要になります。私のはこのように見えます:

アプリケーションルートから:symfony build-model; cp config / slave-propel.ini config / propel.ini; symfony propel:build-sql; symfony propel:insert-sql --no-confirmation; cp config / propel-master.ini config / propel.ini; symfony propel:build-sql; symfony propel:insert-sql --no-confirmation;

ステップ5

1つのデータベースを使用してモデルを既に構築し、現在分割を実行している場合は、/ lib/modelをクリーンアップする必要があります。「map」および「om」ディレクトリとルートディレクトリのファイルを削除すると、競合を回避するのに役立ちます。

ステップ6

コードで2つのデータベースを使用するには、次のように接続にビットを追加する必要があります。

例1:

$object = self::doSelect($c, Propel::getConnection('master'));

例2:

$newObject->save(Propel::getConnection('slave'));

例3:

$con = Propel::getConnection("propel");
$sql = "ALTER TABLE runlinhp CHANGE class class_rat varchar(15)";
$stmt = $con->prepare($sql);
$stmt->execute();
于 2012-07-05T13:43:27.930 に答える