我刚开始用的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还是我想的东西楔不支持?
我这样说的: 如何使用两个数据库在推进 ,但我不确定如何实际执行,在代码。
谢谢您的帮助
在你的架构文件,你可以为它表示你的表类的名称。 他们没有使用相同的名称表。 你这样做与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"
数据库元素指的是数据库的名称,而不是具有类似名称的类)
然后,在构建时,推动将产生WestCoastUser
, WestCoastUserQuery
, WestCoastUserPeer
, EastCoastUser
, EastCoastUserQuery
和EastCoastUserPeer
。 每个班级将连接用它在你的架构中定义的数据库。
我写了这个原本为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();