【问题标题】:Propel Multiple Database Modeling推动多数据库建模
【发布时间】:2012-06-29 23:05:57
【问题描述】:

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

我读到这个:How to use two database in propel,但不确定如何在代码中实际执行它。

感谢您的帮助

【问题讨论】:

  • 您能否详细说明您希望如何使用这些数据?您是否希望使用UserQuery 来搜索这两个数据库?或者,您是否希望西海岸的网站用户搜索一个数据库,而东海岸的用户搜索另一个?

标签: php database-design model propel


【解决方案1】:

在您的架构文件中,您可以为代表您的表的类提供一个名称。它们不必使用与表相同的名称。您可以使用 table 元素上的 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 将生成 WestCoastUserWestCoastUserQueryWestCoastUserPeerEastCoastUserEastCoastUserQueryEastCoastUserPeer。每个类都将使用它在您的架构中定义的数据库进行连接。

【讨论】:

  • 这看起来正是我想要/需要的。我要测试一些东西,应该在本周末之前发布/奖励。感谢乔什莫的快速回复。
【解决方案2】:

我最初是为 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

第一步

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

等等……

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。这些文件中的每一个都需要针对各自的数据库进行配置。

第四步

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

从应用程序根目录: symfony 构建模型; cp 配置/slave-propel.ini 配置/propel.ini; symfony 推进:构建-sql; symfony 推进:插入-sql --no-confirmation; cp 配置/propel-master.ini 配置/propel.ini; symfony 推进:构建-sql; symfony propel:insert-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();

【讨论】:

    猜你喜欢
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2012-04-30
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多