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这样的模型,每个模型都引用正确的数据库/等,或者我试图插入不支持的东西?

我读到这个:如何在推进中使用两个数据库,但不确定如何在代码中实际执行它。

谢谢您的帮助

4

2 回答 2

2

在您的模式文件中,您可以为代表您的表的类提供一个名称。它们不必使用与表相同的名称。您可以使用phpNametable 元素上的属性来执行此操作。

例如,您的 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 将生成WestCoastUser, WestCoastUserQuery, WestCoastUserPeer, EastCoastUser,EastCoastUserQuery和, EastCoastUserPeer。每个类都将使用它在您的架构中定义的数据库进行连接。

于 2012-07-02T16:32:55.623 回答
1

我最初是为 symfony 1.2 编写的,但我相信这一切都适用。

我在这个例子中使用 Symfony 1.2.4。我有两个数据库,主数据库和从属数据库

如果您要使用多个数据库,您需要做一些事情。

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

使用两个单独的连接创建 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步

如前所述,您将需要两个模式文件。请注意,您需要为与表匹配的数据库定义一个包属性,在这种情况下,它是主连接的“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 }

ETC.....

slave.schema.yml

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

ETC.....

第 3 步

您将需要创建单独的 propel.ini 文件。在这个例子中,我使用了 propel-master.ini 和 propel-slave.ini。这些文件中的每一个都需要针对它们各自的数据库进行配置。

第4步

您将需要一个好的批处理文件来使用推进工具构建您的数据库。我的看起来像这样:

从应用程序根目录:symfony build-model;cp 配置/slave-propel.ini 配置/propel.ini;symfony 推进:构建-sql;symfony 推进:插入-sql --no-confirmation;cp 配置/propel-master.ini 配置/propel.ini;symfony 推进:构建-sql;symfony 推进:插入-sql --no-confirmation;

第 5 步

如果您已经使用一个数据库构建了模型并且现在正在进行拆分,则需要清除 /lib/model。删除“map”和“om”目录以及根目录中的文件将帮助您避免冲突。

第 6 步

要在代码中使用这两个数据库,您需要在连接中添加一些内容,如下所示:

示例 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 回答