推进多数据库建模(Propel Multiple Database Modeling)

2019-09-18 20:06发布

我刚开始用的Propel工作,我喜欢它,但我有一个关于如何利用多个数据库连接的问题。 我知道我可以在我的架构连接到多个不同的数据库设置的东西了,但我很好奇如何在代码中处理这个问题。

我的问题是多个数据库,和他们每个人都有,没有数据仓库略有不同的模式。 因此,我有类似的东西如下:

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

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

现在在PHP非行走的版本,我做这一切的手,并根据需要手动切换数据库。 我希望能简化的东西一点,我很好奇如何建模。 有没有一种方法我可以有类似eastCoastUser和westCoastUser模型,每个引用正确的数据库的/ etc还是我想的东西楔不支持?

我这样说的: 如何使用两个数据库在推进 ,但我不确定如何实际执行,在代码。

谢谢您的帮助

Answer 1:

在你的架构文件,你可以为它表示你的表类的名称。 他们没有使用相同的名称表。 你这样做与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"数据库元素指的是数据库的名称,而不是具有类似名称的类)

然后,在构建时,推动将产生WestCoastUserWestCoastUserQueryWestCoastUserPeerEastCoastUserEastCoastUserQueryEastCoastUserPeer 。 每个班级将连接用它在你的架构中定义的数据库。



Answer 2:

我写了这个原本为symfony1.2 1.2,但我相信这一切适用。

我使用的Symfony 1.2.4本example.I有两个数据库,主机和从机

,如果你要使用多个数据库,还有,你将需要做一些事情。

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 }

等等.....

slave.schema.yml

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

等等.....

第3步

您将需要创建单独的propel.ini文件。 在这个例子中,我使用的推进,master.ini和推动,slave.ini。 每一个文件都需要配置为各自的数据库。

第四步

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

从应用程序根目录:symfony的构建模型; CP配置/从属propel.ini配置/ propel.ini; symfony的推进:建立-SQL; symfony的推进:插入-SQL --no-确认; CP配置/推进-master.ini配置/ propel.ini; symfony的推进:建立-SQL; symfony的推进:插入-SQL --no-确认;

第5步

您将需要清理掉/ lib目录/模型,如果你已经使用建一个数据库,模型和现在正在做的分裂。 删除文件在“地图”和“嗡”的目录和根目录将帮助你避免冲突。

第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();


文章来源: Propel Multiple Database Modeling